PHP 的協程化是什麼意思?

時間 2021-06-03 01:09:22

1樓:

沒啥複雜的東西。

磁碟IO,網路IO一般都是同步阻塞的。

像你上述提到的三個類庫,都是網路IO,一般情況下都是同步阻塞的方式。

1.並不是「協程化」之後才能用;不修改,同步阻塞操作會阻塞整個程序,能處理的併發請求就少了,就失去了使用協程的初衷了。

2.第三方類庫一般都設計的很好,只要自定義乙個handler,實現指定的介面類,就可以完成所謂的協程化。

3.凡是涉及到網路IO的,一般都要用協程客戶端重新實現一遍。

2樓:Abby Chau

1. 因為協程是共用同一程序的,如果不修改,則會引起堵塞。

2. 理論上來說,協程的併發是軟時間分片,而如何分片則是Reactor 和它的上層實現來解決的。

方法上都是把客戶端重寫一次。

以已經能使用協程的curl / mysql / redis 三個協定為例。

因為Swoole 早完成了swoole_http_client_coro 的http 客戶端,所以把Curl 的介面重定向一次就完了。

也就是說, 你在寫go() 時看見的curl_* ,其實是在利用swoole_http_client_coro。

而swoole_mysql_coro 則是基於mysqlnd, 以 `swoole::coroutine::Socket;` 發起連線。

而redis 則是利用 hiredis + `swoole::coroutine::Socket;` , socket 是交回全域性的SwooleTG.reactor 管理的。

而co::exec() 則是利用 sh 對命令產生乙個新的fd 再用`swoole::coroutine::Socket;`迴圈讀取

可見在Swoole 中的Socket 十分重要。

3. 如果在類中有出現過掛起執行緒的動作,那就一定要修改了。如果有堵塞,則會令併發失效。

3樓:codinghuang

以最簡單的場景思考,不考慮複雜的場景:

1、乙個執行緒阻塞,作業系統會掛起這個執行緒,切換到其他執行緒。

2、在同乙個執行緒裡面建立的多個協程,本質上都是這個執行緒,只不過每個協程的上下文不同,導致這個執行緒的上下文跟著變化了。每個時刻,執行著的協程,都是去代表這個執行緒去執行。

3、在同乙個執行緒裡面,它所包含的協程是無法同時執行的,只能夠執行其中乙個。所以,你甚至可以理解為此時的協程就是這個執行緒。所以,協程如果阻塞,也就意味這個執行緒阻塞,那麼就會和第一條說的那樣,作業系統會掛起這個執行緒,切換到其他執行緒。

因為這個執行緒被掛起,所以這個執行緒裡面的其他協程無法正常執行。

而「協程化」的含義就是,去除協程/執行緒的阻塞。至於怎麼去除,這就是另乙個問題了,你需要學習一些C語言程式設計知識才能夠理解。

如果乙個第三方庫帶有阻塞的介面,那麼協程的優勢就會失效。

PHP的協程跟GO的協程實現有什麼區別?

Shulamith 黑色高階車和白色低階車的區別 swoole那個基本上就是最常見的有棧協程的實現,各種語言社群裡一抓一大把,主要作用是給只會 只能用PHP的程式設計師打雞血.go的實現則比較高階,主要優勢在於 跑在多個系統執行緒上,可以充分利用多核 讓出執行權的節點不只是io,還有函式呼叫 xtl...

python協程是什麼?

雞蛋有點黃 協程和程序的區別其他答案都寫的很好了,我就是複製一下流暢的python書中對執行緒和協程的比較說明 如果使用執行緒做過重要的程式設計,你就知道寫 出程式有多麼困難,因為排程程式任何時候都能中斷執行緒。必須記住保留鎖,去保護程式 中的重要部分,防止多步操作在執行的過程中中斷,防止資料處於無...

飯圈化是什麼意思?

張子鑫 我提一腳飯圈化這個概念。在中文V家,飯圈化的概念在我看來是這樣的問題。你們喜歡的是誰?洛天依還是中文V家?當然。舉洛天依的例子是因為這個例子問題最嚴重,禾念自從採用實際上的偶像化道路之後將洛天依當主了,對於其他歌姬雖然會採用洛天依宣傳的部分方法,但是力度和規模都不如,由此導致問題相對於洛天依...