首頁 > 後端開發 > Golang > 主體

管道概念

王林
發布: 2024-07-17 17:24:07
原創
1283 人瀏覽過

作者最容易理解的定義是多個並發運行的進程,每個進程都是一系列相互關聯的進程階段的一部分。

類比是這樣的:想像一下常規資料庫自動備份的流程,其中有很多資料庫需要備份。對於備份本身,我們使用 go 程序,而不是 shell 腳本。也許將要執行的一系列流程階段概述如下。

  1. 我們需要一個必須備份的所有資料庫的資料列表,以及它們的存取位址和憑證。
  2. 我們運行備份進程,可以依序(在 db1 之後、完成、繼續 db2、繼續 db3 等),也可以並行(db1、db2、db3 等。備份進程和其他進程同時運行)。
  3. 在每個資料庫備份過程中,都會進行幾個過程

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 是一系列進程,所以進程總是順序的,而行代表一個序列。

Image description

在Go中,一般以goroutine形式執行的進程是並發的,但在流程中它必須是順序的,它被稱為管道,所以暫時假設管道A是進程的goroutine A、管道B是goroutine B等等。

為了更容易理解表格,請依照順序說明:

  1. 序列 1:管道 A 將從 db1 執行轉儲程序。同時,管道B和C處於空閒狀態。 2.Sequence2:db1 dumy過程完成,進入下一階段,即管道B執行db1資料轉儲過程,同時管道A執行db2轉儲過程。 C管道仍然閒置。
  2. 序列 3:管道 A 正在執行 db3 轉儲程序。同時,管道B尚未運行已轉儲的db2歸檔進程,因為歸檔db1仍未完成。管道仍然閒置。
  3. 序列4:db1歸檔過程完成,然後進入下一階段,即將歸檔發送到備份伺服器,該過程由管道C處理。同時管道B開始運行db2資料轉儲歸檔和管道A轉儲
  4. ...等等。

在這個例子中,我們假設管道A只有一個goroutine,管道B也有一個goroutine,管道C也有一個goroutine。但實際上在現實世界的實現中,每個管道可以有很多goroutine(管道A有很多goroutine,管道 B 的許多 goroutine,管道 C 的許多 goroutine)。

我希望我的文字可以解釋。即使不清楚,網路也是開放的,有 LAN 資源。

以上是管道概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板