亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

golang怎么實現線程池

小億
144
2023-10-20 18:29:19
欄目: 編程語言

在Golang中,可以使用goroutine和channel來實現線程池。下面是一個簡單的示例:

package main

import (
	"fmt"
	"sync"
)

type Job struct {
	id int
}

type Worker struct {
	id         int
	jobChannel chan Job
	quit       chan bool
}

func NewWorker(id int, jobChannel chan Job) *Worker {
	return &Worker{
		id:         id,
		jobChannel: jobChannel,
		quit:       make(chan bool),
	}
}

func (w *Worker) Start(wg *sync.WaitGroup) {
	go func() {
		defer wg.Done()
		for {
			select {
			case job := <-w.jobChannel:
				fmt.Printf("Worker %d started job %d\n", w.id, job.id)
				// 模擬處理任務
				// time.Sleep(time.Second)
				fmt.Printf("Worker %d finished job %d\n", w.id, job.id)
			case <-w.quit:
				return
			}
		}
	}()
}

func (w *Worker) Stop() {
	go func() {
		w.quit <- true
	}()
}

type Pool struct {
	jobChannel chan Job
	workers    []*Worker
	wg         sync.WaitGroup
}

func NewPool(numWorkers, maxJobs int) *Pool {
	jobChannel := make(chan Job, maxJobs)
	workers := make([]*Worker, numWorkers)

	for i := 0; i < numWorkers; i++ {
		workers[i] = NewWorker(i+1, jobChannel)
	}

	return &Pool{
		jobChannel: jobChannel,
		workers:    workers,
	}
}

func (p *Pool) Start() {
	for _, worker := range p.workers {
		worker.Start(&p.wg)
		p.wg.Add(1)
	}
}

func (p *Pool) AddJob(job Job) {
	p.jobChannel <- job
}

func (p *Pool) Stop() {
	for _, worker := range p.workers {
		worker.Stop()
	}
	p.wg.Wait()
	close(p.jobChannel)
}

func main() {
	pool := NewPool(3, 10)
	pool.Start()

	for i := 0; i < 10; i++ {
		pool.AddJob(Job{id: i + 1})
	}

	pool.Stop()
}

在上面的示例中,我們定義了一個Job結構體表示需要執行的任務,Worker結構體表示線程池中的工作協程。Pool結構體表示線程池,其中包含一個任務通道和多個工作協程。

在Pool的Start方法中,我們為每個Worker啟動一個獨立的協程,并等待工作協程完成任務。

在Pool的AddJob方法中,我們將任務放入任務通道,Worker會從通道中獲取任務并執行。

最后,在main函數中,我們創建一個線程池,并向線程池中添加10個任務。然后,調用線程池的Stop方法等待任務執行完成。

請注意,上述示例中的任務僅僅是打印一些信息,你可以根據實際需求來修改任務的執行邏輯。

0
遵化市| 江北区| 岫岩| 江川县| 石柱| 合作市| 仁寿县| 勃利县| 达拉特旗| 东港市| 碌曲县| 长治县| 定远县| 东明县| 黄骅市| 襄樊市| 遵义市| 霍城县| 天气| 缙云县| 周宁县| 大邑县| 桑日县| 碌曲县| 延川县| 清涧县| 北流市| 英山县| 海阳市| 斗六市| 噶尔县| 临泉县| 澎湖县| 南安市| 八宿县| 鹿邑县| 民和| 彭州市| 五寨县| 都昌县| 康乐县|