parallel-php/parallel-task

PHP并行任务多线程消息库

1.0.0 2016-10-08 20:24 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:04:01 UTC


README

库,用于以简单直观的方式在多台计算机上运行并行PHP任务。

它能做什么

  • 委托任务以改善应用程序的响应时间。例如,而不是直接发送电子邮件,它可以异步发送。
  • 委托不需要立即可见的结果的任务或当前脚本中不需要响应的任务。这里的示例可以从小到大的简单任务,如记录,到可以延迟处理以提高高峰性能的复杂应用程序逻辑。
  • 并行处理。可以并行化的算法可以通过在多台不同的机器上启动多个工作进程并汇总所有完成后的结果来从该库中受益。

如何使用它

  • 选择队列实现并创建其实例。现有实现:Redis和RabbitMQ。需要更多实现的帮助。
  • 使用队列构建工作进程并在命令行环境中启动它。您可以启动多个工作进程。
$workerBuilder = new ExecutorWorkerBuilder()
$worker = $workerBuilder->withConsumeQueue($queue)->buildWorker();
$worker->work($type);
  • 使用队列构建执行器
$executorBuilder = new ExecutorWorkerBuilder()
$executor = $executorBuilder->withPublishQueue($queue)->buildExecutor();
  • 通过实现Task接口来定义一个任务。
  • 提交任务并获取结果
$futureResult = $executor->submit($type, MyTask::class, [$param1, $param2]);
//...some other time consuming tasks
$result = $futureResult->getResult();

技术上,该库分为三个部分

  • 队列模块。处理队列实现细节。从外部来看,它包含两个公共接口PublishQueueConsumeQueue以及从其方法中输入/输出实体:InputMessageInputMessageIdentifierOutputMessage

    • putInput接收一个InputMessage并将其存储以供处理。
    • submitInput接收一个InputMessage,将其存储以供处理,并返回一个InputMessageIdentifier以获取结果。
    • getOutput接收一个InputMessageIdentifier并返回与它对应的OutputMessage结果。它会阻塞,直到结果可用。
    • run接收一个可调用对象。它应该获取一个InputMessage,用它作为输入运行可调用对象,并将接收到的Output存储起来。
  • 任务模块。使用队列模块添加一个Task实现层。从外部来看,它有两个类和两个接口:TaskSchedulerTaskRunner,每个都用于为异步运行调度任务以及分别异步运行任务。

    TaskScheduler的接口是

    • execute接收一个新的任务及其输入。它应该用于没有返回类型的方法。
    • submit接收一个新的任务及其输入,并返回一个FutureTaskResult。应该用于有返回类型的方法。

    TaskRunner的接口是

    • run异步循环中运行任务
    • runOnce只异步运行一个任务
  • 执行器/工作进程外观。它只是任务模块的包装,以便更容易地进行组合和使用。

    有一个构建器可以帮助创建ExecutorWorker,允许配置PublishQueueConsumeQueue的实现,并更改默认实现TaskInputMessageTransformerTaskFactoryTaskResultMessageTransformerTaskRunnerSupervisor