在Go语言中,可以使用goroutine和channel来实现线程池。下面是一个简单的示例代码:
```go
package main
import (
"fmt"
"sync"
)
type Job struct {
id int
}
func worker(id int, jobs <-chan Job, results chan<- int) {
for job := range jobs {
fmt.Printf("Worker %d started job %d\n", id, job.id)
// 这里可以执行具体的任务逻辑
results <- job.id // 将结果发送到results通道中
}
}
func main() {
const numWorkers = 5
const numJobs = 10
jobs := make(chan Job, numJobs)
results := make(chan int, numJobs)
var wg sync.WaitGroup
wg.Add(numWorkers)
// 启动多个worker
for i := 1; i <= numWorkers; i++ {
go func(workerID int) {
worker(workerID, jobs, results)
wg.Done()
}(i)
}
// 提供一些工作给worker
for i := 1; i <= numJobs; i++ {
jobs <- Job{id: i}
}
close(jobs)
// 等待所有工作完成
wg.Wait()
// 关闭结果通道
close(results)
// 输出结果
for result := range results {
fmt.Printf("Job %d completed\n", result)
}
}
```
这段代码中,我们首先定义了一个`Job`结构体来表示具体的任务。然后,在`worker`函数中,我们从`jobs`通道中接收任务,然后执行具体的任务逻辑,并将结果发送到`results`通道中。
在`main`函数中,我们创建了两个通道:`jobs`用于存放任务,`results`用于存放结果。然后,我们使用`sync.WaitGroup`来等待所有的worker完成任务。
接下来,我们启动了多个worker,并将它们绑定到`jobs`和`results`通道上。然后,我们向`jobs`通道中发送一些任务。最后,我们等待所有的worker完成任务,并关闭`results`通道。最后,我们从`results`通道中读取结果并输出。
这样就实现了一个简单的线程池。每个worker都会从`jobs`通道中接收任务,并通过`results`通道将结果返回。
本网转载内容版权归原作者和授权发表网站所有,仅供学习交流之用,如有涉及版权问题,请通知我们尽快处理。