在Golang中,并發編程主要通過goroutines和channels來實現。Goroutines是輕量級的線程,可以在一個操作系統線程上并發執行多個任務。Channels則用于在不同的goroutines之間傳遞數據。
下面是一個簡單的示例,展示了如何使用goroutines和channels實現并發編程:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup, jobs <-chan int, results chan<- int) {
defer wg.Done()
for job := range jobs {
fmt.Printf("Worker %d started job %d\n", id, job)
results <- job * 2
fmt.Printf("Worker %d finished job %d\n", id, job)
}
}
func main() {
const numJobs = 10
const numWorkers = 3
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
var wg sync.WaitGroup
wg.Add(numWorkers)
for i := 0; i < numWorkers; i++ {
go worker(i, &wg, jobs, results)
}
for i := 0; i < numJobs; i++ {
jobs <- i
}
close(jobs)
wg.Wait()
close(results)
for result := range results {
fmt.Println("Result:", result)
}
}
在這個示例中,我們創建了一個名為worker
的函數,它接收一個整數作為輸入,并將其乘以2作為結果返回。我們創建了3個工作線程(goroutines),它們從jobs
通道中讀取任務,并將結果寫入results
通道。
在main
函數中,我們創建了jobs
和results
通道,然后啟動了3個工作線程。接著,我們將10個任務發送到jobs
通道。最后,我們等待所有工作線程完成任務,并關閉results
通道。在這個過程中,我們可以看到任務是如何在不同的工作線程之間并發執行的。