助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
# 1.9.24 调度支持 Stream 模式 [TOC] > 只适用于同步模式 **单连接并发的同步服务器**一般使用`dispatch_mode = 3`调度请求分配到`Worker`进程,底层实现使用了忙闲识别方式。 * 当`Worker`进程接收到请求回调`onReceive`或`onRequest`时,将`Worker`进程的状态设置为`BUSY`,这时`Reactor`线程将不会再给当前的`Worker`进程分配新的请求 * 当`Worker`进程处理完当前的请求后,将状态设置为`IDLE`,这时`Reactor`线程将会继续给当前的`Worker`进程分配新请求 `dispatch_mode = 3`忙闲分配模式,在极端情况下所有`Worker`均处于`BUSY`时,会退化为`dispatch_mode = 1`轮询模式。无论`Worker`进程处于闲还是忙的状态,都会分配到新请求。这样极端情况下,某些请求可能会无法被最快处理。使用`dispatch_mode = 3`时,需要保证绝大部分时间有充足的空闲`Worker`。 在`1.9.24`版本中底层新增加了`Stream`模式。将`dispatch`的过程进行了逆转,`Reactor`线程不再调度决定向哪个`Worker`进程投递新请求,而是发起一个`Stream`的`Connect`到一个`Unix Socket`端口。 * 空闲的`Worker`会`Accept`连接,并接收`Reactor`传递的新请求 * `Worker`进程处理请求期间不再`Accept`,新请求将有其他`Worker`进行处理 * `Worker`进程完成请求处理后,直接使用`Stream`的通道向对应的`TCP`客户端连接发送结果数据,响应完毕后关闭`Reactor`和`Worker`之间的`Stream`连接 新的`Stream`模式使用配置`dispatch_mode = 7`来设置开启。此模式的最大优势是:**无论任何极端情况下,都可以保证请求会被最快被处理**。 ## 使用实例 ~~~ $serv = new swoole_server("127.0.0.1", 9501); $serv->set(array( 'dispatch_mode' => 7, 'worker_num' => 2, )); $serv->on('receive', function (swoole_server $serv, $fd, $threadId, $data) { var_dump($data); echo "#{$serv->worker_id}>> received length=" . strlen($data) . "\n"; }); $serv->start(); ~~~