歡迎來到這篇帶有貶義標題的文章。
但是,在這篇文章中,我想以一種非常簡單的方式向您解釋程式設計的這兩個特徵,這次使用我最喜歡的程式語言 GOLANG.
讓我們想像一個廚房:
煮菜:這個代表一個任務。
廚師:他是加工者。
同意:
廚房裡有幾位廚師:每人準備不同的菜餚。
在 Go 中:每個廚師都是一個 goroutine。雖然廚房(處理器)只有一台烤箱,但廚師可以同時處理菜餚,在等待烤箱可用的同時花時間處理其他任務。
並行度:
各種烤箱:每位廚師都有自己的烤箱。
在 Go 中:如果我們有多個實體處理器,每個 goroutine 可以在不同的處理器上運行,在現實生活中同時烹飪多個菜餚。
有什麼差別?
並發:即使在單一處理器上,任務也是交織執行的,給人一種並行的錯覺。
並行性:任務在多個處理器上同時運行,這顯著加快了進程。
如何在 Go 中使用它們?
Goroutines:它們就像輕線程。要建立 goroutine,我們只需在函數之前使用 go 關鍵字:
讓我們來看一個如何在 golang 中使用 goroutine 的範例:
go func() { // Código que se ejecutará en una goroutine }()
Channels:這些是 goroutine 可以進行通訊和同步的管道。
想像它們是在廚師之間傳遞原料的管子
ch := make(chan int) go func() { ch實際例子:
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此程式碼的輸出將是
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 之間的通訊。
啟動goroutines:循環 for i := 1;我 工作函數接收 ID 和通道。
發送值到通道:循環for 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/Twitter
GitHub
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3