Symfony Process 组件的过程池组件

dev-master 2019-03-02 18:21 UTC

This package is auto-updated.

Last update: 2024-09-29 05:09:26 UTC


README

Build Status

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...
        }
        //...
    }   
 //...

您可以在 这篇博客文章 中找到一个示例用例。