php多線程執行個體詳解

來源:互聯網
上載者:User
作業系統能夠進行運算調度的最小單元,包含在進程中,是進程的實際運算單位。一條線程指的是進程中一個單一順序的控制流程,一個進程中可以並發多個線程,每條線程並存執行多個任務。

一個多線程程式比單線程被程式調用的機率更大,所以多線程一般會比單線程程式更加高效。
多線程程式的多個線程可以在多核CPU的多個核心運行,完全發揮多核cpu的優勢。
特點:
線程的建立和切換的系統開銷都比進程小,所以一定程度上會比多進程更加高效。
線程天生共用記憶體空間,線程間的通訊更簡單,避免了進程IPC引入新的複雜度。
適用情境:
隨便使用多線程並不能提升程式的執行效率,線程的建立和銷毀,內容相關的切換,線程同步都是有效能消耗的。
1.I/O 阻塞會使作業系統發生任務調度,阻塞當前任務,所以代碼中 I/O 多的情況下,使用多線程時可以將代碼並行。例如多次讀整塊的檔案,或請求多個網路資源。
2.多線程能充分利用 CPU,所以有多處大計算量代碼時,也可以使用多線程使他們並存執行.
PHP的多線程:
php預設不支援多線程,需要添加pthread擴充,
必須使用 --enable-maintainer-zts 參數重新編譯 PHP,這個參數是指定編譯 PHP 時使用安全執行緒方式。
安全執行緒:
安全執行緒是編程中的術語,指某個函數、函數庫在多線程環境中被調用時,能夠正確地處理多個線程之間的共用變數,使程式功能正確完成。
在傳統多線程中,由於多個線程共用變數,所以可能會導致出現如下問題:
存在一個全域數組$arr = array('a');;
A 線程擷取數組長度為1;
B 線程擷取數組長度為1;
A 線程 pop 出數組元素 $a = array_pop($arr); $a = 'a';;
B 線程也 pop 數組元素 $b = array_pop($arr); $a = null;;
此時 B 線程內就出現了靈異事件,明明數組長度大於0,或沒有 pop 出東西;
PHP實現:
使用TSRM機制對全域變數和靜態變數進行隔離
將全域變數和靜態變數給每個線程都複製一份,各線程使用的都是主線程的一個備份,避免了變數衝突,也不會出現安全執行緒問題。
出現的問題:
子線程一旦運行,主線程就不能再對子線程進行細節調整。線程就失去了線程之間通過全域變數進行訊息傳遞的能力。
使用TSRM機制分配和使用變數就會有額外的損耗,所以不需要多線程的PHP環境中 使用ZTS(非安全執行緒)
類和方法:
PHP將線程封裝成了Thread類,線程的建立通過執行個體化一個線程對象來實現,由於類的封裝性,變數的使用智能
通過建構函式傳入,線程的運算結果也需要通過類變數傳出。
Thread方法:
run():此方法是一個抽象方法,每個線程都要實現此方法,線程開始運行後,此方法中的代碼會自動執行;
start():在主線程內調用此方法以開始運行一個線程;
join():各個線程相對於主線程都是非同步執行,調用此方法會等待線程執行結束;
kill():強制線程結束;
isRunning():返回線程的運行狀態,線程正在執行run()方法的代碼時會返回 true;
因為安全執行緒的實現,PHP的多線程開始運行後,無法再通過共用記憶體空間通訊,線程也無法通過線程間通訊複用。
相關推薦:

PHP多線程管道通訊的應用

H5的多線程如何?Web Worker

php實現非同步呼叫多線程的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.