在Golang中,實現Linux中的并發編程主要依賴于Go的并發原語,如goroutines和channels。以下是一些關于如何在Linux中使用Golang進行并發編程的基本步驟和示例:
Goroutines是Go語言中的輕量級線程,可以輕松地啟動成千上萬個。
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Printf("Number: %d\n", i)
time.Sleep(1 * time.Second)
}
}
func main() {
go printNumbers() // 啟動一個新的goroutine
time.Sleep(6 * time.Second) // 等待足夠的時間讓goroutine完成
}
Channels是goroutines之間通信和同步的主要方式。
package main
import (
"fmt"
)
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 將結果發送到channel
close(c)
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 從channel接收結果
fmt.Println(x, y, x+y)
}
sync
包提供了一些工具來幫助管理goroutines之間的同步,例如WaitGroup
。
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 在函數結束時調用Done()
fmt.Printf("Worker %d starting\n", id)
// 模擬工作
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 增加WaitGroup的計數器
go worker(i, &wg)
}
wg.Wait() // 等待所有goroutines完成
}
context
包可以用來傳遞截止時間、取消信號和其他請求范圍的值。
package main
import (
"context"
"fmt"
"time"
)
func doSomething(ctx context.Context) {
select {
case <-time.After(2 * time.Second):
fmt.Println("Done")
case <-ctx.Done():
fmt.Println("Cancelled")
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
go doSomething(ctx)
time.Sleep(3 * time.Second) // 等待足夠的時間觀察結果
}
通過使用goroutines、channels、sync包和context包,你可以在Linux環境中輕松地實現高效的并發編程。這些工具提供了強大的機制來管理并發任務、同步數據和處理超時及取消操作。