wikimedia/wait-condition-loop

等待达到条件或超时的时间循环

v2.0.2 2021-08-23 19:25 UTC

This package is auto-updated.

Last update: 2024-09-12 06:06:52 UTC


README

Latest Stable Version License

PHP的等待条件循环

此类用于等待条件达成,并可以指定超时时间。当条件回调函数返回 CONDITION_REACHED 或 true 时,认为条件达成。也可以使用 CONDITION_ABORTED 来停止循环。

此外,还可以注入 "工作" 回调函数,以便进行有用的工作,而不仅仅是让当前线程休眠或阻塞在 I/O 上。循环会在每次检查条件回调函数时运行这些回调函数之一,只要还有回调函数可以运行。

循环类将自动根据 CPU 使用情况,在重试条件或使用 usleep() 之前进行重试。低 CPU 使用率和显著的真实时间流逝用于检测条件回调函数是否似乎使用了阻塞 I/O。只有在所有 "工作" 回调函数都已运行后,才会使用 usleep()。这意味着条件回调函数可以是 "即时" 的 CPU 密集型检查,也可以是具有小超时的阻塞 I/O 调用。这两种情况都应自动工作,而无需 CPU 密集型旋转循环。

有关此库的更多文档可以在 mediawiki.org 上找到。

使用方法

// Pre-compute some value that will be needed later
$result = null;
$workCallback = function () use ( &$result ) {
    $result = ( $result !== null ) ? $result : $this->doWork();

    return $result
}

$loop = new WaitConditionLoop(
    function () use ( ... ) {
        if ( ... ) {
            // Condition reached; stop loop
            return WaitConditionLoop::CONDITION_REACHED;
        }
        // Condition not reached; keep checking
        return WaitConditionLoop::CONDITION_CONTINUE;
    },
    3.0, // timeout in seconds
    [ $workCallback ]
);
$status = $loop->invoke(); // CONDITION_* constant

// Call $workCallback as needed later

运行测试

composer install
composer test