我举例个场景,我起了一个5秒一次请求的定时任务,任务中5秒后业务代码还没执行完,这时候会不会出现没有执行完,就启动下次任务,这样子久而久之造成堆积呢?
我自己的见解就是,在一次任务中,使用请求库中的并发请求来调用接口通知
每个进程都是顺序处理的,不会并发执行任务
好的,感谢你的回答,也就是当前定时任务未执行完之前,这个任务是不会继续执行了?
对
我是類似場景,但用的是timer,如:
public function onworkerstart(){ $this->task(); } private function task(){ curl_init(); //....... curl_exec(); Timer::add(5,function(){ $this->task(); },null,false); }
因为我这边远程调用有延迟,还要处理一堆通知业务,可能预设的时间内没办法完成,所以担心在未完成之前,当前的任务又开始执行了
我之前也是怕這樣,所以我是執行完然後設置個一次性的執行器,固定執行完後x秒內再次執行
我不管是什么样的定时系统都会加锁
文件锁 $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] ); }
🩸🩸问的很好的问题
每个进程都是顺序处理的,不会并发执行任务
好的,感谢你的回答,也就是当前定时任务未执行完之前,这个任务是不会继续执行了?
对
我是類似場景,但用的是timer,如:
因为我这边远程调用有延迟,还要处理一堆通知业务,可能预设的时间内没办法完成,所以担心在未完成之前,当前的任务又开始执行了
我之前也是怕這樣,所以我是執行完然後設置個一次性的執行器,固定執行完後x秒內再次執行
我不管是什么样的定时系统都会加锁
文件锁
$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] );
}
🩸🩸问的很好的问题