) type ThreadPool struct { workerNum int // 工作线程数量 taskQueue chan func() // 任务队列 wg sync.WaitGroup // 等待所有任务完成
} func"> ) type ThreadPool struct { workerNum int // 工作线程数量 taskQueue chan func() // 任务队列 wg sync.WaitGroup // 等待所有任务完成
} func">
117.info
人生若只如初见

golang线程池怎么实现

在Go语言中,可以使用goroutinechannel来实现线程池。下面是一个简单的线程池实现示例:

package main

import (
	"fmt"
	"sync"
)

type ThreadPool struct {
	workerNum int           // 工作线程数量
	taskQueue chan func()  // 任务队列
	wg        sync.WaitGroup // 等待所有任务完成
}

func NewThreadPool(workerNum int) *ThreadPool {
	return &ThreadPool{
		workerNum: workerNum,
		taskQueue: make(chan func()),
	}
}

func (tp *ThreadPool) Start() {
	for i := 0; i < tp.workerNum; i++ {
		go tp.worker()
	}
}

func (tp *ThreadPool) worker() {
	for task := range tp.taskQueue {
		task()
		tp.wg.Done()
	}
}

func (tp *ThreadPool) AddTask(task func()) {
	tp.wg.Add(1)
	tp.taskQueue <- task
}

func (tp *ThreadPool) Wait() {
	tp.wg.Wait()
}

func main() {
	// 创建线程池
	pool := NewThreadPool(3)
	// 启动线程池
	pool.Start()

	// 添加任务到线程池
	for i := 0; i < 10; i++ {
		taskNum := i
		pool.AddTask(func() {
			fmt.Printf("Task %d is running\n", taskNum)
		})
	}

	// 等待所有任务完成
	pool.Wait()
}

在上面的示例中,ThreadPool结构体表示线程池,包含workerNum表示工作线程的数量,taskQueue表示任务队列,wgsync.WaitGroup用于等待所有任务完成。

NewThreadPool函数用于创建一个新的线程池,Start方法启动线程池中的工作线程,worker方法用于执行任务,AddTask方法用于往线程池中添加任务,Wait方法用于等待所有任务完成。

main函数中,创建一个线程池并启动,然后循环添加任务到线程池中,最后调用Wait方法等待所有任务完成。

当运行上述代码时,你会看到输出结果中的任务是并发执行的,最多同时执行3个任务,这就是线程池的作用。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe074AzsLBQNeAF0.html

推荐文章

  • golang底层是什么语言

    Go语言(也称为Golang)的底层主要是由C语言编写的,并且在后续的版本中,Go语言完成了语言自举,即使用Go语言自身来编写编译器。这使得Go语言的编译器和运行时环...

  • golang协程和线程的区别有哪些

    Golang协程(Goroutine)和线程的区别主要体现在以下几个方面: 轻量级:Golang的协程是由Golang运行时管理的,相较于操作系统级的线程,协程更轻量级,启动和销...

  • golang动态生成struct的方法是什么

    在Go语言中,可以使用reflect包来动态生成struct。下面是一个示例代码:
    package main
    import (
    "fmt"
    "reflect"
    )
    type Person ...

  • golang怎么爬取动态内容

    要爬取动态内容,你可以使用以下几种方法:1. 使用headless浏览器:可以使用一些基于Chrome或Firefox的headless浏览器库,如Puppeteer或Selenium。这些库可以模拟...

  • weblogic事务超时怎么设置

    在WebLogic中,您可以通过以下步骤来设置事务超时时间: 打开WebLogic管理控制台。
    导航到您的WebLogic域。
    在域设置中,选择“事务”选项卡。
    在...

  • weblogic如何控制节点启动

    在WebLogic服务器中,可以通过以下几种方式来控制节点的启动: 使用WebLogic的管理控制台:在管理控制台中,可以选择特定的节点,然后点击“启动”按钮来启动该节...

  • golang异步任务处理的方法是什么

    在Go语言中,可以使用goroutine和channel来实现异步任务处理。 Goroutine:Goroutine是Go语言中轻量级的线程,可以在程序中同时执行多个任务。使用goroutine可以...

  • docker怎么查看镜像信息

    要查看Docker镜像的信息,可以使用以下命令: 列出所有本地镜像: docker images 该命令会显示本地所有的镜像,包括镜像的ID、仓库名称、标签、大小和创建时间等...