想利用swoole协程下提升下并发.

bobshipwood

问题描述

原本的代码,do中用到的modbus tcp链接(一种底层3次tcp握手才能在上面跑的协议)。其中foreach下面会每一次迭代会同步执行代码,包括建立modbus tcp链接(因为不同的服务端ip)。

我想问的是,这里面用协程会不会提升并发?

$plcs = [];
foreach ($devicePlcs as $devicePlc) {
    $plcs[] = $this->do($devicePlc); // 实际业务代码;
}

协程版本:(因为子协程间是一遇到网络io就理论上让给主协程去控制)

$plcs = [];
foreach ($devicePlcs as $devicePlc) {
    Coroutine::create(function () {
        $plcs[] = $this->do($devicePlc); // 实际业务代码;
    }
}

不知道我的理解正确不?

为此你搜索到了哪些方案及不适用的原因

没有找到

168 1 0
1个回答

轻云蔽月

得看底层具体用什么函数连接的modbus tcp链接,如果这个函数swoole有hook到就行

  • bobshipwood 1天前

    用的是aldas/modbus-tcp-client这个库,不知道能否加速?

  • 轻云蔽月 20小时前

    我看了下用的是stream系列的函数,swoole是有hook这些函数的,不过,tcp连接必须在协程内部创建,不能在协程外部创建,否则还是阻塞的

  • bobshipwood 7小时前

    也就是说,在Coroutine::create(function () {
    里面创建。才能生效?

  • bobshipwood 6小时前

    还有个问题?就是说一个协程内,底层只建立一个tcp的3次握手,然后就进行多次的modbus 交互,也就是复用了tcp链接,这种情况下,用协程还能加速吗?

    我的意思是,协程是不是仅在tcp链接和断开的情况下,就是发生网络io的情况下,才会产生切换协程的操作,否则不产生协程切换

🔝