2

我正在编写一个基于 Amphp 库的长时间运行脚本,它将轮询外部服务器以获取要运行的任务列表,然后执行这些任务。

在来自服务器的响应中将是退避计时器,它将控制脚本何时发出下一个请求。

由于我对异步编程很陌生,所以我正在尝试的东西不起作用。

我试图创建一个具有 \Amp\Pause(1000) 的 \Amp\repeat() 以便每次重复都会暂停 1 秒。

这是我的测试代码:

function test() {
    // http request goes here...

    echo 'server request '.microtime(true).PHP_EOL;

    // based on the server request, change the pause time
    yield new \Amp\Pause(1000);
}

Amp\execute(function () {
    \Amp\onSignal(SIGINT, function () {
        \Amp\stop();
    });

    \Amp\repeat(100, function () {
        yield from test();
    });
});

我预计会发生的是,在每次重复时,test() 函数会在回声后暂停 1 秒,但回声每 100 毫秒(重复时间)运行一次。

在过去,我会使用 while 循环和 usleep() 来完成此操作,但由于 usleep() 阻止了此操作,因此无法达到目的。

我正在使用来自 github master 分支的 PHP 7.0 和 Amphp。

4

1 回答 1

1

\Amp\repeat无论回调何时终止,每 100 毫秒调用一次回调。

\Amp\execute(function () {
    /* onSignal handler here for example */

    new \Amp\Coroutine(function () {
        while (1) {
            /* dispatch request */
            echo 'server request '.microtime(true).PHP_EOL;
            yield new \Amp\Pause(100);
        }
    });
});

这是使用正常循环,在最后一次操作后仅持续 100 毫秒。

[如果我误解了您到底想要什么,请在评论中注明。]

于 2016-11-04T23:01:49.860 回答