swoole / rfc

Swoole 提案
116 stars 3 forks source link

RFC-1017: 获取父协程ID, 判断协程是否存在 #41

Closed twose closed 5 years ago

twose commented 5 years ago

Co::getPcid

echo Co::getPcid(), "\n";
go(function () {
    echo Co::getPcid(), "\n";
    go(function () {
        echo Co::getPcid(), "\n";
        go(function () {
            echo Co::getPcid(), "\n";
            go(function () {
                echo Co::getPcid(), "\n";
            });
            go(function () {
                echo Co::getPcid(), "\n";
            });
            go(function () {
                echo Co::getPcid(), "\n";
            });
        });
        echo Co::getPcid(), "\n";
    });
    echo Co::getPcid(), "\n";
});
echo Co::getPcid(), "\n";

输出

0作为未来保留的主协程id, 目前不会作为返回值 非嵌套协程调用getPcid将返回-1 (从非协程空间创建的) 在非协程内调用getPcid将返回-1 (非协程没有父协程, 指向自己)

-1
-1
1
2
3
3
3
1
-1
-1

Co::exist

go(function () {
    go(function () {
        go(function () {
            Co::sleep(0.001);
            var_dump(Co::exists(Co::getPcid())); // 1: true
        });
        go(function () {
            Co::sleep(0.003);
            var_dump(Co::exists(Co::getPcid())); // 3: false
        });
        Co::sleep(0.002);
        var_dump(Co::exists(Co::getPcid())); // 2: false
    });
});

Implemented in: https://github.com/swoole/swoole-src/commit/6812049a1cd478535ed94025a96884ee34d0016c https://github.com/swoole/swoole-src/commit/1884d60fe6af880ef781399a4544014128f02ac7

twose commented 5 years ago

注意

协程之间并没有实质上的持续父子关系, 协程之间是相互隔离, 独立运作的 此Pcid可理解为创建了当前协程的协程id

用途

串联多个协程调用栈

go(function () {
    go(function () {
        $ptrace = Co::getBackTrace(Co::getPcid());
        // balababala
        var_dump(array_merge($ptrace, Co::getBackTrace(Co::getCid())));
    });
});