歡迎來到這篇帶有貶義標題的貼文。
但是,在這篇文章中,我想以一種非常簡單的方式向您解釋程式設計的這兩個特徵,這次使用我最喜歡的程式語言GOLANG。
讓我們想像一個廚房:
做菜:這代表一個任務。
廚師:他是個加工者。
出席人數:
廚房裡的幾位廚師:每個人準備不同的菜餚。
在 Go 中:每個廚師都是一個 goroutine。雖然廚房(處理器)只有一台烤箱,但廚師們可以同時處理自己的菜餚,在等待烤箱可用的同時將時間花在其他任務上。
並行度:
各種烤箱:每個廚師都有自己的烤箱。
在 Go 中:如果我們有多個實體處理器,每個 goroutine 都可以在不同的處理器上運行,以真正的方式同時烹飪多個菜餚。
有什麼差別?
並發:即使在單一處理器上,任務也是交織執行的,給人一種並行的錯覺。
並行性:任務在多個處理器上同時運行,這顯著加快了進程。
如何在 Go 中使用它們?
Goroutines:它們就像輕線程。要建立 goroutine,我們只需在函數前使用 go 關鍵字:
讓我們來看一個如何在 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中文網其他相關文章!