考虑以下代码:
Loop::run(function() {
Loop::onSignal(SIGINT, function () use ($w) {
echo "Caught SIGINT! exiting ...\n";
Loop::stop();
});
while([$jobId, $jobData] = yield $beanstalk->reserve()) {
$response = yield $httpClient->send($request);
yield $beanstalk->delete($jobId);
}
});
据我了解,当此代码收到 aSIGINT
时,回调 inLoop::onSignal
将在下一个滴答时执行,因此循环将停止并且程序退出。
在这种情况下,如果循环$httpClient->send()
中while
尚未结束,则不会执行下一行,也不会删除 Beanstalk 消息。然后将重试 Beanstalk 作业,如果 HTTP 请求不是幂等的,这可能会导致问题。我们可以用数据库调用代替 HTTP 请求。
有没有办法告诉循环不执行新的生成器并等待正在进行的生成器在SIGINT
收到 a 时完成?
我一直试图解决这个问题,但找不到解决方案。