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
        }
    });
});
posted @ 2022-03-12 23:50  alwayslinger  阅读(163)  评论(0编辑  收藏  举报