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模编程语言