1

考虑以下代码:

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 时完成?

我一直试图解决这个问题,但找不到解决方案。

4

1 回答 1

0

没有这样的选项,但是您可以通过添加标志轻松地在简单的应用程序中实现您想要的。

Loop::run(function() {
    $running = true;

    Loop::onSignal(SIGINT, function () use (&$running) {
        echo "Caught SIGINT! exiting ...\n";
        $running = false;
    });

    while($running && [$jobId, $jobData] = yield $beanstalk->reserve()) {
        $response = yield $httpClient->send($request);
        yield $beanstalk->delete($jobId);
    }
});

这将简单地继续当前请求并随后退出。

于 2018-03-20T18:41:21.113 回答