CSP ,全稱:Communicating Sequential Process ,翻譯成中文是,通信順序進程,最初於Tony Hoare的1977年的論文中被描述,影響了許多編程語言的設計。用於描述兩個的ulinix並發的實體通過共享的通訊管道(channel)進行通信的 並發模型。在該模型中,channel 是比較重要的對象,它並不關注發送消息的實體,而只關心與發送消息時實體使用的channel
其簡單的模型可以大概簡化如下:
work1 ——->Channel ————->work2
work1和work2並不直接通信,而是通過中間的媒介角色Channel
進行通信。消息的發送者work1和work2通過channel
實現了松耦合。、
Go語言中是通過goruntime 和channel實現的;
php swoole 中是通過協程(\Swoole\Coroutine)+ 通道(Channel)來實現的
下面是使用php 的swoole 寫的協程並發:
$http = new swoole_http_server("127.0.0.1", 9501); $http->on("request", function ($request, $response) { $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); $client->connect("127.0.0.1", 8888, 0.5); //調用connect將觸發協程切換 $client->send("hello world from swoole"); //調用recv將觸發協程切換 $ret = $client->recv(); $response->header("Content-Type", "text/plain"); $response->end($ret); $client->close(); }); $http->start();
當代碼執行到connect()
和recv()
函數時,底層會觸發進行協程切換,此時可以去處理其他的事件或者接受新的請求。當此客戶端連接成功或者后端服務回包后,底層會恢復協程上下文,代碼邏輯繼續從切換點開始恢復執行。開發者整個過程不需要關心整個切換過程。
協程可以理解為純用戶態的線程
,其通過協作而不是搶占來進行切換
。相對於進程或者線程,協程所有的操作都可以在用戶態完成
,創建和切換的消耗更低。Swoole可以為每一個請求創建對應的協程,根據IO的狀態來合理的調度協程,這會帶來了以下優勢:
開發者可以無感知的用同步的代碼編寫方式
達到異步IO的效果和性能,避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中導致代碼無法維護
同時由於底層封裝了協程,所以對比傳統的PHP層協程框架,開發者不需要使用yield關鍵詞來標識一個協程IO操作,所以不再需要對yield的語義進行深入理解以及對每一級的調用都修改為yield,這極大的提高了開發效率
可以滿足大部分開發者的需求。對於私有協議,開發者可以使用協程的TCP或者UDP接口去方便的封裝。
swoft 框架中,在bin文檔的開頭部分,就指定了協程的set option:nums
代碼如下:
Swoole\Coroutine::set([ 'max_coroutine' => 300000, ]);
參考文檔:
1.php swoole的協程
2.並發模型:Actors與CSP
3.Actor模型和CSP模型的區別
4.Actor模