swoole单socket多协程读写实现思路
swoole单socket多读多写实现思路
方式一 利用通道的阻塞效果达成同一时刻只有一个协程能够访问到socket效果
# 伪代码
use Swoole\Coroutine;
use Swoole\Coroutine\Channel;
use function Swoole\Coroutine\run;
run(function () {
$mutexChan = new Channel();
Coroutine::create(function () use ($mutexChan) {
$mutexChan->push(1);
// $sock->recvAll();
$mutexChan->pop();
});
Coroutine::create(function () use ($mutexChan) {
$mutexChan->push(1);
// $sock->recvAll();
$mutexChan->pop();
});
});
方式二 csp模型 参考开原框架zinx实现思路 真正的读写socket的协程各只有一个,即只有两个协程负责通信,其他的协程通过管道和读写协程通信,同样实现了同一时刻只有一个协程能够对socket进行读写
# 伪代码
run(function () {
Coroutine::create(function () {
while (1) {
$payload = $sock->recvAll();
if ($cond1) {
$chan1->push($payload)
} else {
$chan1->push($payload)
}
}
});
Coroutine::create(function () {
while (1) {
$a = $chan1->pop();
// TODO
}
});
Coroutine::create(function () {
while (1) {
$a = $chan2->pop();
// TODO
}
});
});