irap/queues

由于英国人喜欢排队,因此这个包用于排队。

2.0.0 2017-11-14 17:16 UTC

This package is auto-updated.

Last update: 2024-09-24 02:32:03 UTC


README

此包创建的目的是简化创建任务队列,例如用于发送异步MySQL查询CURL请求

需求

队列

SerialRunnableQueue

按顺序逐个运行项目(FIFO),等待每个项目完成后再运行下一个。

ParallelRunnableQueue

并行运行项目。这些项目可以以任何顺序执行/完成。这是实现性能优势的地方。

RunnableStack

以与SerialRunnableQueue相同的方式执行项目,但与FIFO不同,项目以相反的顺序执行,最后添加的项目首先执行。

接口

为了使用队列,放入队列的对象需要实现RunnableInterface接口,这意味着对象有一个返回true时任务已完成的run方法。此方法将在队列调用直到返回true。这看起来很愚蠢,但对于可能需要一些时间才能完成的异步请求是必要的,因此您需要跟踪对象中的状态并在结果返回时返回true。

队列中的队列

由于所有队列都实现了RunnableInterface,因此可以创建其他队列的队列,以创建所需的任何组合。例如,您可能有一些“任务”,这些任务必须按一定顺序执行,但是每个“任务”可能包含数百个可以以任何顺序执行的“子任务”。在这种情况下,您可能希望创建一个ParallelRunnableQueue来放置每个子任务组。然后,您将这些并行队列放入单个SerialRunnableQueue对象中,以确保组按正确顺序执行。

每个队列在其构造函数中可以接受一个可选的回调。此回调在队列完成/清空时执行,允许开发者在队列完成后运行逻辑。

队列的大小不是固定的,您可以使用add方法在需要时向它们添加,包括在它们运行时。但是,请记住,每次队列耗尽时都会调用队列的回调。

示例用法

...

$asyncQuery1 = new \iRAP\AsyncQuery\AsyncQuery(
    $sql1,
    $queryCallback1,
    $connectionPool
);

$asyncQuery2 = new \iRAP\AsyncQuery\AsyncQuery(
    $sql2,
    $queryCallback2,
    $connectionPool2 # <-- different pool, perhaps for a different database?
);

$parallelRunnableQueue = new \iRAP\Queues\ParallelRunnableQueue($queueCallback);

$parallelRunnableQueue->add($asyncQuery1);
$parallelRunnableQueue->add($asyncQuery2);

# Run until the queue has completed all of the tasks.
while ($parallelRunnableQueue->run() !== TRUE)
{
    usleep(1);
}

自动测试

只需转到testing目录并执行main.php脚本。所有添加新功能的相关代码贡献都应该提供相关的测试用例。阅读自动化测试以获取示例用法可能是个好主意。