ibrahimgunduz34 / shepherd
Symfony Process 组件的过程池组件
dev-master
2019-03-02 18:21 UTC
Requires
- psr/log: 1.1.0
- squizlabs/php_codesniffer: ^3.4
- symfony/config: ^3.3|^4.0
- symfony/dependency-injection: ^3.3|^4.0
- symfony/http-kernel: ^3.3|^4.0
- symfony/process: ^3.3|^4.0
Requires (Dev)
- phpunit/phpunit: ^5.7|^7.5.0
This package is auto-updated.
Last update: 2024-09-29 05:09:26 UTC
README
Shepherd 是一种简单的方式来并行运行进程。您还可以控制可以并行运行的进程数量,或者在队列中任何任务失败时停止所有任务。
如何安装
使用以下命令将包添加到项目中作为 composer 依赖项。
composer require ibrahimgunduz34/shepherd
如何配置
您可以在 pools
部分 separately 定义您的进程池。您还可以在 defaults
部分定义一些默认选项,并在需要时在每个池定义中覆盖它们。
shepherd: defaults: max_processes: 4 fail_on_error: true pools: foo: max_processes: 2 fail_on_error: false bar: max_processes: 8
如何使用
基本上,Shepherd 为每个池定义创建服务。因此,您可以简单地在任何地方注入池。它使用 shepherd.pool.<pool name>
命名约定创建服务。
App\Service\MyService: class: App\Service\MyService arguments: - '@shepherd.pool.foo'
您可以在开始池处理之前继续添加新的进程。
<?php namespace App\Service; use Shepherd\Bundle\ProcessPoolBundle\ProcessPool; use Symfony\Component\Process\Process; class MyService { /** @var ProcessPool */ private $pool; function __construct(ProcessPool $pool) { $this->pool = $pool; } public function performSomething() { //... $this->pool->append(new Process([__DIR__ . '../bin/console', 'do:something', 'param1', 'param2'])); $this->pool->append(new Process([__DIR__ . '../bin/console', 'do:something', 'param3', 'param4'])); $this->pool->append(new Process([__DIR__ . '../bin/console', 'do:something', 'param5', 'param6'])); //... //... //... $this->pool->start(); } }
如果任何作业失败,如何停止流程
要使整个流程失败,如果任何作业失败,您必须在定义池时将 fail_on_error
定义为 true。
shepherd: pools: foo: max_processes: 2 fail_on_error: true
然后您必须处理由 start()
方法抛出的错误。
<?php //... function performSomething() { //... try { $this->pool->start(); } catch (Shepherd\Bundle\ProcessPoolBundle\Exception\ProcessExecutionError $exception) { //TODO: Do something... } //... } //...
您可以在 这篇博客文章 中找到一个示例用例。