CSP 編程模型

CSP ,全稱:Communicating Sequential Process ,翻譯成中文是,通訊順序進程,最初於Tony Hoare的1977年的論文中被描述,影響了許多編程語言的設計。用於描述兩個的ulinix併發的實體經過共享的通信管道(channel)進行通訊的 併發模型。在該模型中,channel 是比較重要的對象,它並不關注發送消息的實體,而只關心與發送消息時實體使用的channel
其簡單的模型能夠大概簡化以下:php

work1 ——->Channel ————->work2html

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

協程能夠理解爲純用戶態的線程,其經過協做而不是搶佔來進行切換。相對於進程或者線程,協程全部的操做均可以在用戶態完成,建立和切換的消耗更低。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模編程語言

相關文章
相關標籤/搜索