歡迎來到這篇帶有貶義標題的貼文。
但是,在這篇文章中,我想以一種非常簡單的方式向您解釋程式設計的這兩個特徵是什麼,這次使用我最喜歡的程式語言GOLANG.
讓我們想像一個廚房:
煮飯:這代表一個任務。
廚師:他是加工者。
出席人數:
廚房裡有幾位廚師:每個人準備不同的菜餚。
在 Go 中:每個廚師都是一個 goroutine。雖然廚房(處理器)只有一台烤箱,但廚師們可以同時處理自己的菜餚,在等待烤箱可用的同時將時間花在其他任務上。
並行性:
各種烤箱:每個廚師都有自己的烤箱。
在 Go 中:如果我們有多個實體處理器,每個 goroutine 都可以在不同的處理器上運行,以真正的方式同時烹飪多個菜餚。
有什麼差別?
並發:即使在單一處理器上,任務也是交織執行的,給人一種並行的錯覺。
並行性:任務在多個處理器上同時運行,這顯著加快了進程。
如何在 Go 中使用它們?
Goroutines:它們就像輕線程。要建立 goroutine,我們只需在函數之前使用 go 關鍵字:
讓我們來看一個如何在 golang 中使用 goroutine 的範例:
通道:它們是 goroutine 可以進行通訊和同步的管道。
想像它們是在廚師之間傳遞食材的管子
實際範例:
此程式碼的輸出將是
雖然有時它可能看起來像這樣
或像這樣
為什麼每次執行程式時輸出都會改變?
程式輸出每次運行都會改變的主要原因是並發的不確定性。
這是正在發生的事情的細分:
建立通道: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(cooks),它們透過通道接收數字。
我們將號碼發送到頻道供廚師處理。
廚師們同時工作,在收到數據時進行處理。
為什麼在 Go 中使用並發和並行?
更好的效能:特別是在 I/O 密集型任務中(例如讀取檔案或發出 HTTP 請求)。
回應速度更快:任務鎖定時應用程式可以繼續回應其他請求。
更具可擴充性的架構:您可以跨多個核心或機器分配工作。
記住!
並發和並行性是強大的工具,但它們也會使程式碼更難以理解和調試。仔細使用它們並理解它們的含義很重要。
您想深入了解某個特定主題嗎?
我們可以探索以下概念:
同步:互斥體、工作小組等
並發模式:生產者-消費者、管道等
並發測試:如何有效測試並發程式碼。
問候,
盧卡托尼勞達爾斯
X/推特
GitHub
以上是GO:傻瓜式並發與並行。的詳細內容。更多資訊請關注PHP中文網其他相關文章!