GO workPool的线程池实现

 更新时间:2023年03月24日 09:24:14   作者:吴佳浩  
本文主要介绍了GO workPool的线程池实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go语言中的线程池是一种用于管理并发执行任务的设计模式。

线程池的主要目的是减少创建和销毁线程的开销,提高系统性能。 在Go语言中,线程池通常使用goroutine和channel来实现。

以下是一个简单的Go线程池实现:

package main

import (
    "fmt"
    "sync"
)

type Job func()

type Worker struct {
    JobQueue chan Job
}

func NewWorker() Worker {
    return Worker{JobQueue: make(chan Job)}
}

func (w Worker) Run(wg *sync.WaitGroup) {
    go func() {
        for job := range w.JobQueue {
            job()
            wg.Done()
        }
    }()
}

type Pool struct {
    JobQueue   chan Job
    WorkerQueue chan chan Job
}

func NewPool(maxWorkers int) *Pool {
    workerQueue := make(chan chan Job, maxWorkers)
    jobQueue := make(chan Job)
    return &Pool{JobQueue: jobQueue, WorkerQueue: workerQueue}
}

func (p *Pool) Run() {
    for i := 0; i < cap(p.WorkerQueue); i++ {
        worker := NewWorker()
        worker.Run(&sync.WaitGroup{})
        p.WorkerQueue <- worker.JobQueue
    }

    go func() {
        for job := range p.JobQueue {
            workerJobQueue := <-p.WorkerQueue
            workerJobQueue <- job
        }
    }()
}

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

    wg := sync.WaitGroup{}
    wg.Add(10)

    for i := 0; i < 10; i++ {
        job := func() {
            fmt.Println("Executing job")
        }
        pool.JobQueue <- job
    }

    wg.Wait()
}

说明

在这个例子中,我们创建了 Worker结构体,它包含一个JobQueue通道,用于接收任务。 NewWorker函数用于创建一个新的Worker实例。 Run方法启动一个goroutine,监听JobQueue通道,当有任务到来时,执行任务并通知WaitGroup

Pool结构体包含一个JobQueue通道和一个WorkerQueue通道。 JobQueue用于接收任务,WorkerQueue用于存储空闲的WorkerNewPool函数用于创建一个新的Pool实例。 Run方法启动指定数量的 Worker并将它们添加到 WorkerQueue中。然后启动一个goroutine,监听 JobQueue通道,当有任务到来时,从 WorkerQueue中取出一个空闲的 Worker,将任务分配给它。

main函数中,我们创建一个包含5Worker的线程池,并向线程池提交10个任务。 使用WaitGroup来等待所有任务完成。

小结有需要的小伙伴可以加以修改使用

到此这篇关于GO workPool的线程池实现的文章就介绍到这了,更多相关GO workPool线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go的固定时长定时器和周期性时长定时器

    Go的固定时长定时器和周期性时长定时器

    本文主要介绍了Go的固定时长定时器和周期性时长定时器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 使用gorm.Scopes函数实现复用查询逻辑示例

    使用gorm.Scopes函数实现复用查询逻辑示例

    这篇文章主要为大家介绍了使用gorm.Scopes函数实现复用查询逻辑示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go语言解决并发问题小结

    go语言解决并发问题小结

    并发是GO最基本的功能了,但是在传统的PHP中是比较困难的,如果不借助其它一些扩展的话,是做不到并发的,这篇文章主要介绍了go语言如何解决并发问题,需要的朋友可以参考下
    2024-05-05
  • Golang构建WebSocket服务器和客户端的示例详解

    Golang构建WebSocket服务器和客户端的示例详解

    这篇文章主要为大家详细介绍了如何使用Go语言构建WebSocket服务器和客户端,以实现双向通信,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-11-11
  • go原子级内存操作实现

    go原子级内存操作实现

    原子级内存操作是在多线程并发执行时,能够确保某个内存操作是不可中断的操作,本文主要介绍了go原子级内存操作实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • go nil处理如何正确返回nil的error

    go nil处理如何正确返回nil的error

    这篇文章主要为大家介绍了go中的nil处理,如何正确返回nil的error实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言基础学习之map的示例详解

    Go语言基础学习之map的示例详解

    哈希表是常见的数据结构,有的语言会将哈希称作字典或者映射,在Go中,哈希就是常见的数据类型map,本文就来聊聊Golang中map的相关知识吧
    2023-04-04
  • 深入分析golang多值返回以及闭包的实现

    深入分析golang多值返回以及闭包的实现

    相对于C/C++,golang有很多新颖的特性,例如goroutine,channel等等,这些特性其实从golang源码是可以理解其实现的原理。今天这篇文章主要来分析下golang多值返回以及闭包的实现,因为这两个实现golang源码中并不存在,我们必须从汇编的角度来窥探二者的实现。
    2016-09-09
  • Go结构体的基本使用详解

    Go结构体的基本使用详解

    本文主要介绍了Go结构体的基本使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go语言中slice的用法实例分析

    Go语言中slice的用法实例分析

    这篇文章主要介绍了Go语言中slice的用法,实例分析了slice的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02

最新评论