2024 日本 PHP 研討會

哲學

本節包含撰寫平行程式碼的重要哲學,以及一些關於 parallel 內部實作的細節。

不要透過共享記憶體來通訊;反之,要透過通訊來共享記憶體。

parallel 擁抱的這個哲學起源於 Go,Go 是目前最受讚賞的平行程式碼撰寫平台之一,即使不是使用最廣泛的。Go 程式設計師必須努力實踐這個理想:PHP 和 parallel 預設為程式設計師完成所有困難的工作。

在其他語言中常見的傳統執行緒模型中,執行緒之間通常僅僅因為它們在同一個位址空間中運作而進行通訊。程式設計師必須部署互斥鎖定、條件變數和其他低階執行緒或同步原語,以確保狀態通訊和一致性。

當傳統模型被反轉時,這表示執行緒僅將記憶體作為通訊的結果來共享(例如,透過通道傳遞變數)。

當 Parallel 以任何方式將變數從一個執行緒傳遞到另一個執行緒時 - 任務參數、透過 Future 返回以及通道 - 都是以傳值的方式進行。 除了無緩衝通道的情況外,變數也會被緩衝,以便在變數被傳遞到的執行緒使用之前,它不會被更改(或銷毀)。透過通道進行的無緩衝讀取是唯一一個執行緒直接讀取由另一個執行緒分配的記憶體的例子,它可以安全地這樣做,因為擁有記憶體的執行緒正在等待讀取完成才能繼續操作它,而沒有擁有記憶體的執行緒則以傳值的方式讀取。 當兩個執行緒繼續執行時,它們不再共享記憶體。

這使得編寫和推理並行程式碼比傳統的執行緒模型容易得多。 這意味著程式設計師不需要考慮執行緒可能同時操作資料,因為這是不可能的。

這也使 PHP 成為實作基於 CSP(透過通道傳遞訊息)的並行 API 的完美平台,因為 PHP 本身是不共享任何東西的 - PHP 執行緒預設在其自己的虛擬位址空間中運行,因此只能透過通訊共享記憶體。

資料應該有一個明確的單一擁有者

當第一次接觸 CSP 模型時,熟悉傳統執行緒模型的程式設計師可能會發現自己在尋找並行資料結構,因為他們已經習慣這樣做:他們傳遞共享物件以進行操作。

在 CSP 模型中,不需要讓多個任務共享資料結構,而且實際上,如果不共享資料結構會更簡單。 資料應該由單個任務擁有,對該資料結構的更改(或操作)應該透過通道傳達並由資料的擁有者執行,更改(或操作)的成功、失敗或結果(狀態)會被傳回。

同樣,PHP 的不共享特性和 Parallel 的傳值特性幫助程式設計師實現這個目標,任何資料都不會被意外共享,只會作為通訊的結果而共享。

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top