Go 中的平行處理
並行程式設計涉及同時執行多個任務,從而可以提高可分為獨立單元的應用程式的性能。 Go 中實作並行性的一種方法是透過 goroutine,即與主程式並行執行的輕量級執行緒。
考慮以下程式碼:
<code class="go">package main import ( "fmt" "math/rand" "time" ) func main() { for i := 0; i < 3; i++ { go f(i) } // prevent main from exiting immediately var input string fmt.Scanln(&input) } func f(n int) { for i := 0; i < 10; i++ { dowork(n, i) amt := time.Duration(rand.Intn(250)) time.Sleep(time.Millisecond * amt) } } func dowork(goroutine, loopindex int) { // simulate work time.Sleep(time.Second * time.Duration(5)) fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex) }</code>
此程式碼使用 goroutine 並發執行 f函數三次。 dowork 函數透過休眠 5 秒來模擬一些工作。
你能假設 dowork 函數會並行執行嗎?
是的,你可以做這個假設。預設情況下,Go 將 GOMAXPROCS 設定為可用核心數,這允許多個 goroutine 並發執行。
這是實現並行性的正確方法嗎?
這是實現並行性的有效方法,但它可能不是最有效的方法。使用沒有同步機制的 goroutine 可能會導致資料競爭和不正確的結果。
使用通道和單獨的 dowork Workers
實現並行性的一種更結構化和可擴展的方法是使用管道和單獨的 dowork 工作人員。這種方法確保每個 goroutine 都有自己的共享資料副本,並透過訊息傳遞進行通訊。
這是一個使用通道的範例:
<code class="go">var results = make(chan int) // channel to collect results func main() { // spawn a worker for each goroutine for i := 0; i < 3; i++ { go worker(i) } // collect results from the worker goroutines for i := 0; i < 10; i++ { result := <-results fmt.Println("Received result:", result) } } func worker(n int) { for i := 0; i < 10; i++ { // perform work and send result through the channel res := dowork(n, i) results <- res } }</code>
結論
Go 中的平行性可以透過 goroutine 來實現。使用通道和單獨的工作人員是一種更結構化和可擴展的方法,可確保資料完整性並提高效能。
以上是與單獨使用 goroutine 相比,通道和單獨的工作線程如何提高 Go 中的並行性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!