Crontab 阻塞的问题

forwebreg

问题描述

这里写问题描述

<?php

namespace crontab;

use Workerman\Crontab\Crontab;

class Test
{
    public function onWorkerStart()
    {
        //CrontabA
        new Crontab('*/1 * * * * *', function () {
            echo date('Y-m-d H:i:s')."-1\n";
        });
        //CrontabB
        new Crontab('0 */1 * * * *', function () {
            echo date('Y-m-d H:i:s')."-5\n";
            sleep(5);
        });
    }
}

不知道是不是我理解得有问题 手册上讲是阻塞的
按这个理解 应该是 CrontabA执行一次 CrontabB执行一次 阻塞5秒 然后执行CrontabA
输出应该是

XXXX-XX-XX XX:XX:00-1
XXXX-XX-XX XX:XX:00-5
XXXX-XX-XX XX:XX:05-1
XXXX-XX-XX XX:XX:06-1
XXXX-XX-XX XX:XX:07-1
XXXX-XX-XX XX:XX:08-1
....

但是我执行起来发现输出是

XXXX-XX-XX XX:XX:00-1
XXXX-XX-XX XX:XX:00-5
XXXX-XX-XX XX:XX:05-1  //
XXXX-XX-XX XX:XX:05-1  // 这几个是
XXXX-XX-XX XX:XX:05-1  // 一下输出
XXXX-XX-XX XX:XX:05-1  // 5次的
XXXX-XX-XX XX:XX:05-1  //
XXXX-XX-XX XX:XX:06-1
XXXX-XX-XX XX:XX:07-1
XXXX-XX-XX XX:XX:08-1
....

是我理解不对吗

191 4 0
4个回答

nitron

是的,你理解不对

注意
定时任务不会马上执行,所有定时任务进入下一分钟才会开始计时执行。
与workerman定时器一样,任务全部在当前进程执行,如果任务没执行完到了下个执行周期则会等待当前任务执行完,新任务执行会延后。

  • 暂无评论
kof21411

阻塞不等于阻止

xiaoming

同一个时刻 只能执行一个逻辑

  • 暂无评论
胡桃
<?php

namespace crontab;

use Workerman\Crontab\Crontab;

class Test
{
    public function onWorkerStart()
    {
        //CrontabA
        new Crontab('*/1 * * * * *', function () { // 每秒钟执行一次
            echo date('Y-m-d H:i:s')."-1\n";
        });
        //CrontabB
        new Crontab('0 */1 * * * *', function () { // 每分钟第 0 秒 执行一次
            echo date('Y-m-d H:i:s')."-5\n";
            sleep(5); // 此处会阻塞进程 5 秒钟,相当于执行 CrontabB 时,整个进程都在等着 CrontabB 执行完毕,CrontabA 会一直延后,累积 5 次后,CrontabB 执行完毕的瞬间执行 5 次被延后的 CrontabA
        });
    }
}
  • 胡桃 6天前

    使用异步 IO 函数代替 sleep(),比如 Swoole 的 co::sleep()

×
🔝