Go 语言通过 goroutines 和 channels 实现并发。goroutine 是轻量级的线程,它们在 Go 语言中用于实现并发执行。channels 是一种同步机制,用于在 goroutines 之间传递数据。
下面是一个简单的示例,展示了如何使用 goroutines 和 channels 实现并发:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("Worker %d started job %d\n", id, j)
time.Sleep(time.Second) // 模拟耗时任务
fmt.Printf("Worker %d finished job %d\n", id, j)
results <- j * 2
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 创建 3 个 worker goroutines
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 分发任务
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 收集结果
for a := 1; a <= numJobs; a++ {
<-results
}
}
在这个示例中,我们创建了一个名为 worker
的函数,它接收一个整数 ID、一个用于接收任务的通道 jobs
和一个用于发送结果的通道 results
。我们在主函数中创建了 3 个 worker goroutines,并将它们与 jobs
和 results
通道关联起来。
接下来,我们通过将任务发送到 jobs
通道来分发任务。当所有任务都发送完毕后,我们关闭 jobs
通道。最后,我们从 results
通道中收集结果,直到通道被关闭。
这个示例展示了如何使用 goroutines 和 channels 实现并发。你可以根据自己的需求调整代码,以适应不同的场景。