首页 > 其他分享 >golang 协程池

golang 协程池

时间:2024-03-12 21:56:23浏览次数:40  
标签:Task JobChannel WorkerNum chan golang 协程池 func Pool

 

package main

import (
   "fmt"
   "time"
)

type Task struct {
   f func() error
}

func (t Task) exec() error {
   return t.f()
}

func NewTask(fun func() error) *Task {
   return &Task{
      f: fun,
   }
}

type Pool struct {
   JobChannel   chan *Task
   EntryChannel chan *Task
   WorkerNum    int
}

func NewPool(workerNum int) *Pool {
   return &Pool{
      JobChannel:   make(chan *Task),
      EntryChannel: make(chan *Task),
      WorkerNum:    workerNum,
   }
}

func (p *Pool) run() {
   //开启数量工作协池池
   for i := 0; i < p.WorkerNum; i++ {
      go p.worker(i)
   }

   //将进入的任务压入job
   for task := range p.EntryChannel {
      p.JobChannel <- task
   }
}

func (p *Pool) worker(workId int) {
   for v := range p.JobChannel {
      fmt.Println("workId", workId)
      v.exec()
   }
}

func main() {
   // 创建一个协程池,最大开启两个协程worker
   p := NewPool(5)

   // 开启一个协程,向Pool中发送10个task任务
   go func() {
      for i := 0; i < 20; i++ {
         p.EntryChannel <- NewTask(func() error {
            fmt.Println("创建一个Task:", time.Now().Format("2006-01-02 15:04:05"))
            return nil
         })
      }
      defer close(p.EntryChannel)
   }()

   // 启动协程池
   p.run()

   time.Sleep(1000)

}

 

标签:Task,JobChannel,WorkerNum,chan,golang,协程池,func,Pool
From: https://www.cnblogs.com/jichenghui/p/18069415

相关文章

  • 【转】Command Pattern in Go (Golang)
     原文: https://www.sohamkamani.com/golang/command-pattern/ packagemainimport"fmt"//TherestaurantcontainsthetotaldishesandthetotalcleaneddishestypeRestaurantstruct{ TotalDishesint CleanedDishesint}//`NewRestaurant......
  • [转]Golang Functional Options Pattern
     原文: https://golang.cafe/blog/golang-functional-options-pattern.html-------------------- GolangFunctionalOptionsPatternTheGo(Golang)FunctionaOptionsPatternisaway,apatternofstructuringyourstructsinGobydesigningaveryexpressivea......
  • golang练习题
    看到一个网站,上面每天发布一道golang练习题,正好拿来练习,顺便整理记录下来。iota,类似枚举值,每个const从0开始计数 String方法相当于java里的toStringgolang处于安全考虑,对指针运算做了很多限制。map的value是不可以取地址的。 ......
  • golang 接口
    接口学习Go语言中的接口时,以下是你需要关注的主要概念和知识点:在Go语言中使用隐式声明的方式实现接口。只要一个类型实现了接口中规定的所有方法,那么它就实现了这个接口1.接口定义接口是一种类型,定义了一组方法的集合。接口定义的方法不包含实现,只有方法签名。示例:Goty......
  • 运行golang测试无法读取环境变量[vscode]
    使用vscode运行golang测试,通常我们会发现无法读取到设置在系统的环境变量,其本质原因是使用vscode启动testing并不是常规的subshell,无法正常读取到系统的环境变量;解决方案:方案1:将环境变量配置在setting.json(适用于变量较少情况)"go.testEnvVars":{"NAME":"zimskyzeng",},......
  • golang基于长度解决粘包问题(gnet)
    使用gnet框架处理Socket粘包问题当服务端处理旧业务tcpscoket,旧的业务是NettySocket使用的是2个字节的长度定义数据的大小。官方支持ICodec去处理,但文档不太友好,这里附上使用方法import( "github.com/panjf2000/gnet")typeDTUSocketServerstruct{ *gnet.EventServer......
  • golang开发_goroutine在项目中的使用姿势
    很多初级的Gopher在学习了goroutine之后,在项目中其实使用率不高,尤其一些跨语言过来的人,对并发编程理解不深入,可能很多人只知道gofunc(),或者掌控不够,谨慎一些,尽量少使用或者不使用,用的话就是gofunc(),主要列一下我们这边的主要使用方法。goroutine在项目中的使用方法看一下样......
  • golang结构体
    在Go语言中,结构体(Struct)是一种用户定义的数据类型,用于组合多个不同类型的字段,每个字段可以是任意的基本类型或其他结构体类型。结构体是一种复合数据类型,用于组织和存储相关的数据。以下是结构体的一些基本概念和用法:1.定义结构体//定义一个结构体typePersonstruct{Firs......
  • golang入门概览
    一、语法golang中数据类型有值类型(boolintstring)和派生类型(structinterface等等)。值类型通常在栈上分配内存,派生类型通常在堆上分配内存。golang中的函数调用,只有值传递,没有引用传递。但是golang提供了指针,使用指针可以达到引用传参的效果,在函数内部修改参数后可以在外......
  • golang将时间转为时间戳碰到的问题
    golang将字符串"2024-03-0716:00:00"转为时间戳代码如下:packagemainimport("fmt""time")funcmain(){//定义时间格式,与字符串中的时间格式匹配constlayout="2006-01-0215:04:05"//要转换的时间字符......