中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
祁阳县| 潍坊市| 自治县| 石城县| 桐城市| 丰都县| 乳山市| 永修县| 三都| 嘉峪关市| 双牌县| 红河县| 拜泉县| 汶川县| 邯郸县| 靖西县| 呼和浩特市| 郯城县| 聂拉木县| 阳泉市| 原阳县| 永德县| 瑞昌市| 澄江县| 叶城县| 肥乡县| 大宁县| 灵丘县| 时尚| 东乌| 郁南县| 启东市| 和政县| 高青县| 营口市| 德格县| 宝清县| 银川市| 广饶县| 昂仁县| 海淀区|