webmancrontab定时任务堆积问题

timber

问题描述

我举例个场景,我起了一个5秒一次请求的定时任务,任务中5秒后业务代码还没执行完,这时候会不会出现没有执行完,就启动下次任务,这样子久而久之造成堆积呢?

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

我自己的见解就是,在一次任务中,使用请求库中的并发请求来调用接口通知

1599 3 2
3个回答

walkor

每个进程都是顺序处理的,不会并发执行任务

  • timber 2023-08-08

    好的,感谢你的回答,也就是当前定时任务未执行完之前,这个任务是不会继续执行了?

  • walkor 2023-08-08

MarkGo

我是類似場景,但用的是timer,如:

public function onworkerstart(){
  $this->task();
}

private function task(){
    curl_init();
    //.......
    curl_exec();
    Timer::add(5,function(){
        $this->task();
    },null,false);
}
  • timber 2023-08-08

    因为我这边远程调用有延迟,还要处理一堆通知业务,可能预设的时间内没办法完成,所以担心在未完成之前,当前的任务又开始执行了

  • MarkGo 2023-08-10

    我之前也是怕這樣,所以我是執行完然後設置個一次性的執行器,固定執行完後x秒內再次執行

  • hzqghost 23天前

    我不管是什么样的定时系统都会加锁

    文件锁
    $lockFile = 'timer_every_day.lock';
    if (file_exists($lockFile)) {
    return; //exit;
    }
    file_put_contents($lockFile, getmypid());
    try {
    $argv = [__FILE__, 'everyDay/exec'];
    include(DIR . "index.php");
    } finally {
    unlink($lockFile);
    }

    网址请求锁, curlGet, curlPut 为封装的处理 curl 的请求参数与返回结果
    $lockUrl = 'https://xxxxx';
    if (curlGet($lockUrl )->isLock == true) {
    return; //exit;
    }
    curlPut($lockUrl, ['lock' => true] );
    try {
    curlGet('http://xxxx1');
    curlGet('http://xxxx2');
    curlGet('http://xxxx3');
    curlGet('http://xxxx4');
    } finally {
    curlPut($lockUrl, ['lock' => false] );
    }

释永战

🩸🩸问的很好的问题

  • 暂无评论
×
🔝