首页 > 其他分享 >Go简单自定义协程池

Go简单自定义协程池

时间:2023-12-27 10:14:49浏览次数:47  
标签:Task 自定义 worker chan 协程池 WorkerQueue func Go Pool

package main

import (
	"fmt"
	"sync"
)

type Task struct {
	f func() error
}

var wg sync.WaitGroup

type Pool struct {
	//任务通道
	JobQueue chan Task
	//worker通道
	WorkerQueue chan chan Task
	//worker数量
	MaxWorkers int
}

func NewPool(maxWorkers int) *Pool {
	return &Pool{
		JobQueue:    make(chan Task, 10),
		WorkerQueue: make(chan chan Task, maxWorkers),
		MaxWorkers:  maxWorkers,
	}
}

func (p *Pool) Run() {
	for i := 0; i < p.MaxWorkers; i++ {
		worker := NewWorker(i+1, p.WorkerQueue)
		worker.Start()
	}

	go p.dispatch()
}

func (p *Pool) dispatch() {
	for {
		select {
		case job := <-p.JobQueue:
			fmt.Println("new job")
			worker := <-p.WorkerQueue
			fmt.Println("append job")
			worker <- job
			fmt.Println("after run job")
		}
	}
}

func (p *Pool) AddTask(task Task) {
	p.JobQueue <- task
}

type Worker struct {
	id          int
	WorkerQueue chan chan Task
	JobChannel  chan Task
	quitChan    chan struct{}
}

func NewWorker(id int, workerQueue chan chan Task) Worker {
	fmt.Println("newWorker")
	return Worker{
		id:          id,
		WorkerQueue: workerQueue,
		JobChannel:  make(chan Task),
		quitChan:    make(chan struct{}),
	}
}

func (w *Worker) Start() {
	fmt.Println("worker start")
	go func() {
		for {
			//将自己的jobChannel放入worker队列中
			w.WorkerQueue <- w.JobChannel
			select {
			case task := <-w.JobChannel:
				fmt.Printf("worker%d start job", w.id)
				task.f()
				fmt.Printf("worker%d finished job", w.id)
			case <-w.quitChan:
				fmt.Printf("worker%d quit", w.id)
				return
			}
		}
	}()
}

func (w *Worker) Stop() {
	go func() {
		w.quitChan <- struct{}{}
	}()
}

func Hello() error {
	fmt.Println("Hello World")
	wg.Done()
	return nil
}

func main() {
	p := NewPool(5)
	p.Run()

	for i := 0; i < 10; i++ {
		task := Task{
			f: Hello,
		}
		wg.Add(1)
		p.AddTask(task)
	}
	wg.Wait()
}

标签:Task,自定义,worker,chan,协程池,WorkerQueue,func,Go,Pool
From: https://www.cnblogs.com/qcy-blog/p/17929873.html

相关文章

  • Golang协程池ants
    官方示例packagemainimport( "fmt" "github.com/panjf2000/ants/v2" "sync" "sync/atomic" "time")varsumint32funcmyFunc(iinterface{}){ n:=i.(int32) atomic.AddInt32(&sum,n) fmt.Printf(&q......
  • 在Go语言中处理HTTP文件上传
    大家好,我是你们可爱又迷人的编程小助手,今天要带你们一起探讨在Go语言中如何处理HTTP文件上传,让我们把这场技术之旅变得轻松有趣吧!首先,想象一下这个场景:你是一个网站的开发者,用户们急切地想要上传他们的照片、文档或者其他类型的文件到你的服务器上。文件上传,听起来就像是一个神秘的......
  • Go语言中的HTTP重定向
    大家好,我是你们可爱的编程小助手,今天我们要一起探讨如何使用Go语言实现HTTP重定向,让我们开始吧!大家都知道,网站开发中有时候需要将用户的请求从一个URL导向到另一个URL。比如说,你可能想将旧的URL结构重定向到新的URL结构,或者将HTTPS重定向到HTTP等。这就需要我们掌握一个神秘的工具:H......
  • 在Go语言中处理HTTP响应的状态码
    在Web开发中,HTTP状态码是不可或缺的一部分,它们为客户端和服务器之间的通信提供了重要的反馈信息。当我们谈论在Go语言中处理HTTP响应的状态码时,我们实际上是在讨论如何正确解析这些状态码,并根据其含义采取适当的操作。在Go的net/http包中,当客户端发送请求并接收到响应时,可以通过检......
  • 自定义php日志类收集应用日志
    <?phpclassMiniLog{ privatestatic$_instance; private$_path; private$_pid; private$_handleArr; function__construct($path){ $this->_path=$path; $this->_pid=getmypid(); } privatefunction__clone(){ } publics......
  • 03django
    作业讲解1.使用自带的sqlite3数据库第一次使用pycharm链接sqlite3也需要先下载驱动2.编写注册、登录功能'''静态文件无法拖拽到pycharm文件栏:C盘不支持采用cv操作'''前期提交post请求初选403需要配置文件注释一行defreg(request):ifrequest.method==......
  • day21 Prometheus Operator优化配置 -Prometheus Operator自定义监控对象(7.13-7.14)
    7.13-PrometheusOperator优化配置1、数据持久化1.1prometheus数据持久化默认Prometheus和Grafana不做数据持久化,那么服务重启以后配置的Dashboard、账号密码、监控数据等信息将会丢失,所以做数据持久化也是很有必要的。原始的数据是以emptyDir形式存放在pod里面,生命周期与po......
  • vue+go实现注册功能
    <!DOCTYPEhtml><html><head><metacharset="utf8"><style>.container{width:400px;margin:0auto;padding:20px;border:1pxsolid#ccc;border-......
  • MagicArray:像php一样,让Go业务代码不再卷!
    卷!一个字形容了当今码农行业的现状。一层一层的代码结构,一个一个dto,entity,vo,req,resp。这些对象越来越多,让码农们非常劳于奔命,加一个字段,改一个字段,影响面有多少。代码量也越来越大。有可能一个代码,要建10多个数据对象。这虽然有点夸张,但体现了行业的乱象。我是曾经写php代码的......
  • [资源管理] SQL Server 通过Resouce Governor来限制用户资源的使用
    创建资源池CREATERESOURCEPOOL[rp_test]WITH(min_cpu_percent=0,max_cpu_percent=1,min_memory_percent=0,max_memory_percent=1,AFFINITYSCHEDULER=AUTO)GO创建负载组CREATEWORKLOADGROUP[wlp_test]WITH(group_max_requests=10,importance=High,request_m......