作者最容易理解的定義是多個並發運行的進程,每個進程都是一系列相互關聯的進程階段的一部分。
類比是這樣的:想像一下常規資料庫自動備份的流程,其中有很多資料庫需要備份。對於備份本身,我們使用 go 程序,而不是 shell 腳本。也許將要執行的一系列流程階段概述如下。
A.對資料庫執行轉儲操作,輸出以許多檔案的形式儲存到資料夾。
B. 然後轉儲檔案以 .zip 或 .tar .gz 格式存檔(例如)
C. 存檔檔案被傳送到備份伺服器,例如 AWS S3。
如果您注意上面的情況,如果許多資料庫的備份過程並行完成,效能可能會更好。對此,作者表示同意。
如果每個資料庫備份進程A、B、C並發運行就更好了,透過讓三個進程(A、B、C)成為並發進程,那麼I/O將提高效率。之後,在進程A、B和C之間,執行將保持順序(因為它必須順序運行。例如,如果先執行B,然後執行A,則不允許);然而,負責執行進程A的goroutine已經完成了。我們可以繼續執行B(這是進程A的下一階段)加上執行其他進程(另一個資料庫);並聯。所以處理 A 的 goroutine 不會閒置。
請注意以下視覺化。該列表示同時運行的 goroutine。但因為這三個 goroutine 是一系列進程,所以進程總是順序的,而行代表一個序列。
在Go中,一般以goroutine形式執行的進程是並發的,但在流程中它必須是順序的,它被稱為管道,所以暫時假設管道A是進程的goroutine A、管道B是goroutine B等等。
為了更容易理解表格,請依照順序說明:
在這個例子中,我們假設管道A只有一個goroutine,管道B也有一個goroutine,管道C也有一個goroutine。但實際上在現實世界的實現中,每個管道可以有很多goroutine(管道A有很多goroutine,管道 B 的許多 goroutine,管道 C 的許多 goroutine)。
我希望我的文字可以解釋。即使不清楚,網路也是開放的,有 LAN 資源。
以上是管道概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!