登录
首页 >  Golang >  Go教程

Golang协程池的实现与应用

来源:脚本之家

时间:2023-05-12 07:59:19 344浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《Golang协程池的实现与应用》,就很适合你!文章讲解的知识点主要包括协程池,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

1. 为什么需要协程池

使用协程池的好处是减少在创建和销毁协程上所花的时间以及资源的开销,解决资源不足的问题。如果不使用协程池,有可能造成系统创建大量同类协程池而导致消耗完内存或者内存泄漏的问题。

2. 使用协程池的优点

  • 不用手动频繁的创建协程了
  • 方便统一管理,只用管理池子就行了
  • 提高响应速度,一有任务如果有刚执行完的协程就能马上去执行新任务

3. 设计思路

Task 任务对象->EntryChannel->JobsChannel

4. 实现一个简单的协程池

4.1 Task 任务对象

type Task struct {
   // Task方法 任务
   method func() error
   // 可以扩展
}
// NewTask 创建一个Task
func NewTask(method func() error) *Task {
   return &Task{
      method: method,
   }
}
// Execute 任务执行
func (t *Task) Execute() {
   err := t.method()
   if err != nil {
      panic(err)
   }
}

4.2 Pool协程池

// 定义一个协程池
type Pool struct {
   // 对外的Task入口
   EntryChannel chan *Task
   // 对内的Task队列
   JobsChannel chan *Task
   // 协程池的最大work数量
   WorkerNum int
}
// NewPool 创建Pool的函数
func NewPool(cap int) *Pool{
   return &Pool{
      EntryChannel: make(chan *Task),
      JobsChannel: make(chan *Task),
      WorkerNum: cap,
   }
}
// 协程池创建一个Worker
func (p *Pool)worker(workID int){
   for task:=range p.JobsChannel{
        task.Execute()  //取到任务就执行
      fmt.Println("worker_id 为",workID)
   }
}
// 让协程池开始真正的工作
func (p *Pool)run() {
   // 根据创建协程池的大小来创建协程工作
   for i := 0; i 

4.3 Main函数

// 主函数 测试
func main(){
   // 创建一些任务
   task:=NewTask(PrintTimeNow)
   // 创建协程池
   pool:=NewPool(4)
   taskNum:=0
   go func(taskNum int) {
      for{
         // 不断的向池子里写入任务task,任务主要是打印当前时间
         pool.EntryChannel

好了,本文到此结束,带大家了解了《Golang协程池的实现与应用》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>