在Go語言中,處理并發的主要方法是使用goroutines和channels。goroutines是輕量級的線程,它們在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)
}
// 分發任務到jobs通道
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 收集結果
for a := 1; a <= numJobs; a++ {
<-results
}
}
在這個示例中,我們創建了一個名為worker
的函數,它接收一個整數ID、一個用于接收任務的通道jobs
和一個用于發送結果的通道results
。我們在main
函數中創建了3個worker goroutines,并將任務分發給jobs
通道。當所有任務完成后,我們從results
通道收集結果。
這個示例展示了如何使用goroutines和channels來處理并發。當然,Go語言還提供了許多其他并發原語,如sync包中的互斥鎖(Mutex)和讀寫鎖(RWMutex),以及sync/atomic包中的原子操作。你可以根據具體需求選擇合適的并發處理方法。