发送数据协程调度

现状

现在 Server/Client->send 在缓存区已满的情况下,会直接返回false,需要借助onBufferFullonBufferEmpty这样复杂的事件通知机制才能实现任务的暂停和恢复。

在实现需要大量发送的场景下,现有机制虽然可以实现,但非常复杂。

思路

现在基于协程可以实现一种机制,直接在当前协程内yield,等待数据发送完成,缓存区清空时,自动resume当前协程,继续send数据。

实例

改进前

for ($i = 0; $i < 100; $i++)
{
    //在缓存区塞满时会直接返回`false`
    $server->send($fd, $data_2m);
}

改进后

for ($i = 0; $i < 100; $i++)
{
    //在缓存区塞满时会 yield 当前协程,发送完成后 resume 继续向下执行
    $server->send($fd, $data_2m);
}

选项

此项特性会改变底层的默认行为,因此需要额外的一个参数来开启。

$serv->set([
    'send_yield' => true,
]);

影响范围