有没有熟悉Swow的大神,帮忙解答下,defer没有按预期执行

ab0029

Swow协程方案下,defer出现的bug

代码如下:

    $a = Coroutine::run(function() {
        $obj = 'a';
        defer(function() use (&$obj) {
            // 这里会使用unset会直接把PHP都奔溃,使用$obj = null;则不会
            // 这里主要是清理内存
            unset($obj);
            var_dump(Coroutine::getCurrent()->isAlive(), 'defer1', $obj);
            sleep(1);
            var_dump('defer1------');
        });

        sleep(10);

        echo '111';
    });

    Coroutine::run(function() use ($a) {
        $a->kill();
    });

    $time = microtime(true);

    \Swow\Sync\waitAll();
    sleep(2);
    var_dump(microtime(true) - $time);

手动kill A协程后,defer函数执行了,发现如下情况
1,里面检测到协程是存活状态
2,var_dump('defer1------'); 这段没有执行
3,defer里面unset直接把php搞奔溃了

这种算不算bug??

201 3 0
3个回答

喵了个咪

这得问swow官方

  • ab0029 1天前

    去提交了https://github.com/swow/swow/issues/267

SillyDog

截图
没复现

  • ab0029 1天前

    defer1--- 没输出

  • ab0029 1天前

    可能我是window环境下执行的

  • SillyDog 1天前

    估计还是win下兼容性问题 看看作者怎么说吧

SillyDog

截图
因为被kill掉了啊

  • ab0029 1天前

    正常不应该defer都兜底了,里面的代码应该都能执行完才对呀

  • ab0029 1天前

    使用usleep(1); 也一样的。一阻塞就不往下执行了

  • SillyDog 1天前

    对的 我去问一下

×
🔝