) 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编译的原理是什么

    Golang的编译原理主要涉及以下几个步骤: 词法分析:将源代码分解为一个个的词法单元,比如关键字、标识符、常量、运算符等。 语法分析:根据词法单元构建抽象语...

  • golang内存分配的方法是什么

    Go语言的内存分配方法主要有两种:静态分配和动态分配。 静态分配:静态分配是指将变量或对象分配在栈上。在编译时,编译器会根据代码的静态结构来确定变量的大小...

  • golang怎么实现消息队列

    在Golang中实现消息队列可以使用Golang的内置库和第三方库来实现。以下是两种常见的实现方式: 使用Golang内置的channel:Golang中的channel是用于在goroutine之...

  • golang防止反编译的方法是什么

    防止Golang代码反编译的方法可以使用以下一些技术: 代码混淆:使用工具对代码进行混淆,使其变得难以阅读和理解。这可以包括重命名变量和函数,插入无用代码和逻...

  • weblogic事务超时怎么设置

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

  • weblogic如何控制节点启动

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

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

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

  • docker怎么查看镜像信息

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