首頁  >  文章  >  後端開發  >  GO:傻瓜式並發與並行。

GO:傻瓜式並發與並行。

WBOY
WBOY原創
2024-08-23 12:30:31627瀏覽

歡迎來到這篇帶有貶義標題的貼文。
但是,在這篇文章中,我想以一種非常簡單的方式向您解釋程式設計的這兩個特徵,這次使用我最喜歡的程式語言GOLANG

讓我們想像一個廚房

做菜:這代表一個任務。
廚師:他是個加工者。
出席人數:

廚房裡的幾位廚師:每個人準備不同的菜餚。
在 Go 中:每個廚師都是一個 goroutine。雖然廚房(處理器)只有一台烤箱,但廚師們可以同時處理自己的菜餚,在等待烤箱可用的同時將時間花在其他任務上。
並行度:

各種烤箱:每個廚師都有自己的烤箱。
在 Go 中:如果我們有多個實體處理器,每個 goroutine 都可以在不同的處理器上運行,以真正的方式同時烹飪多個菜餚。

有什麼差別?

並發:即使在單一處理器上,任務也是交織執行的,給人一種並行的錯覺。
並行性:任務在多個處理器上同時運行,這顯著加快了進程。

如何在 Go 中使用它們?

Goroutines:它們就像輕線程。要建立 goroutine,我們只需在函數前使用 go 關鍵字:

GO: Concurrencia vs Paralelismo Para Tontos.

讓我們來看一個如何在 golang 中使用 goroutine 的範例:

go func() {
    // Código que se ejecutará en una goroutine
}()

通道:這些是 goroutine 可以進行通訊和同步的管道。
想像它們是在廚師之間傳遞食材的管子

ch := make(chan int)
go func() {
    ch <- 42 // Enviar un valor por el canal
}()
value := <-ch // Recibir un valor del canal

實際範例:

package main

import (
    "fmt"
    "time"
)

func worker(id int, c chan int) {
    for n := range c {
        fmt.Printf("Worker %d received %d\n", id, n)
        time.Sleep(time.Second)
    }
}

func main() {
    c := make(chan int)

    for i := 1; i <= 5; i++ {
        go worker(i, c)
    }

    for n := 1; n <= 10; n++ {
        c <- n
    }
    close(c)

    time.Sleep(time.Second)
}

這段程式碼的輸出將是

Worker 1 received 1
Worker 2 received 2
Worker 3 received 3
Worker 4 received 4
Worker 5 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 4 received 9
Worker 5 received 10

雖然有時它可能看起來像這樣

Worker 5 received 1
Worker 1 received 3
Worker 2 received 2
Worker 4 received 5
Worker 3 received 4
Worker 3 received 6
Worker 5 received 10
Worker 2 received 8
Worker 4 received 7
Worker 1 received 9

或像這樣

Worker 5 received 1
Worker 1 received 2
Worker 2 received 3
Worker 3 received 4
Worker 4 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 5 received 9
Worker 4 received 10

為什麼每次執行程式時輸出都會改變?

程式輸出每次運行都會改變的主要原因是並發的不確定性。

這是正在發生的事情的詳細資訊

建立一個通道:make(chan int) 建立一個整數通道。該通道將用於 goroutine 之間的通訊。

啟動 goroutine:循環 for i := 1;我 工作函數接收 ID 和通道。

送到通道:n := 1 的循環; n 1 到10 的值發送到頻道。

關閉通道:close(c)呼叫關閉通道,表示不會再傳送任何值。

從通道接收值:每個 goroutine 使用 for n := range c 循環從通道接收值。當接收到一個值時,它會被印到控制台。

等待 goroutine 完成:time.Sleep(time.Second) 呼叫確保主 goroutine 在退出之前等待其他 goroutine 完成。

到目前為止

我們建立 5 個 goroutine(cook),透過通道接收數字。
我們將號碼發送到頻道供廚師處理。
廚師們同時工作,在收到數據時進行處理。

為什麼在 Go 中使用並發和並行?

更好的效能:特別是在 I/O 密集型任務中(例如讀取檔案或發出 HTTP 請求)。
提高回應能力:任務鎖定時應用程式可以繼續回應其他要求。
更具可擴充性的架構:您可以跨多個核心或機器分配工作。

記住!

並行和並行性是強大的工具,但它們也會使程式碼更難以理解和調試。仔細使用它們並理解它們的含義非常重要。

您想深入了解某個特定主題嗎?

我們可以探索以下概念:

同步:互斥體、工作小組等
並發模式:生產者-消費者、管道等
並發測試:如何有效測試並發程式碼。

您好,
盧卡托尼勞達爾斯

X/Twitter
GitHub

以上是GO:傻瓜式並發與並行。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn