想问下在协程内创建Timer和在Timer内创建协程的情况对比?

bobshipwood

问题描述

1 在Timer内创建协程,是否可行?假设Timer已经轮询到期(示例中2.5秒),协程内的执行是否会继续(假设2.5秒内都无法执行完毕这个协程?)

$timer_id = Timer::add(2.5, function()  {
    Coroutine::create(function () {
        $this->coroutine()
    }
});

2 在协程内创建Timer,是否可行?是否这个协程的生命周期会用不结束?

Coroutine::create(function () {
    Timer::add(2.5, function()  {
        echo 111;
    }
}

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

找不到

129 2 0
2个回答

Timer不需要在xx中创建这种前条件,本身只在事件循环中增加了一个事件,至于事件触发的时候你要做什么比如开启一个协程做某些事情是独立的两个逻辑。可能你担心的阻塞问题是因为Fiber驱动下不是所有的函数都是非阻塞的,导致使用这些函数时你觉得Timer会阻塞。

  • bobshipwood 2天前

    非也,我是用swoole驱动,单纯只是想了解下这两种的情况。

轻云蔽月
$timer_id = Timer::add(2.5, function()  {
    $this->coroutine()
});

本身定时器执行回调的时候,会主动帮你创建协程的。
Swoole定时器的回调由事件循环自动调度至新协程中执行,因此每个回调都能运行完毕而不会被中断。此外,只要事件循环本身不被阻塞,定时器就能持续且准时地触发后续回调。

🔝