react-parallel/worker-pool

👷👷‍♀️👷‍♂️ 仅用于特定指定任务的worker池


README

Continuous Integration Latest Stable Version Total Downloads Code Coverage Type Coverage License

仅使用一个特定指定任务创建池

安装

要通过 Composer 安装,请使用以下命令,它将自动检测最新版本并将其与 ~ 绑定。

composer require react-parallel/worker-pool

用法

<?php

use Money\Money;
use React\EventLoop\Factory;
use ReactParallel\Factory as ParallelFactory;
use ReactParallel\Pool\Worker\Workers\ReturnWorkerFactory;
use ReactParallel\Pool\Worker\Workers\WorkObject;

require dirname(__DIR__) . DIRECTORY_SEPARATOR . 'vendor/autoload.php';

$loop = Factory::create();
$parallelFactory = new ParallelFactory($loop);
$workerFactory = new ReturnWorkerFactory();

$pool = new \ReactParallel\Pool\Worker\Worker($parallelFactory, $workerFactory, 133);
$pool->perform(new WorkObject(Money::EUR(512)))->always(function () use ($pool) {
    $pool->close();
})->done(function (Money $money) {
    echo $money->getAmount();
});

$loop->run();

创建自己的工作线程

一个工作线程由两个类组成,一个由工厂创建的工厂和一个工作线程。由于 ext-parallel 的工作性质,将类和标量传输到线程是很昂贵的。工作线程被设计为尽可能长时间地重用相同的线程。为了了解它是如何工作的,让我们看看返回的工作线程。首先,我们创建工厂,它是一个数据传输对象,用于从主线程启动到工作线程。你放入其中的任何内容都将发送到工作线程。你放入其中的越少越好。一旦工厂被发送到线程,它上面的 construct 方法将被调用以创建实际的工作线程。

<?php

declare(strict_types=1);

namespace ReactParallel\Pool\Worker\Workers;

use ReactParallel\Pool\Worker\Work\Worker as WorkerInterface;
use ReactParallel\Pool\Worker\Work\WorkerFactory;

final class ReturnWorkerFactory implements WorkerFactory
{
    public function construct(): WorkerInterface
    {
        return new ReturnWorker();
    }
}

创建工作线程后,它将监听传入的工作,并为每个传入的工作 DTO 调用 perform 方法。《ReturnWorker》将简单地将其接收的工作发送回主线程。(这是一种非常简单而有效的方法来测试线程是否按预期工作,并且包含在此处,以供任何希望使用此包作为一套简单工具开始的人使用。)

<?php

declare(strict_types=1);

namespace ReactParallel\Pool\Worker\Workers;

use ReactParallel\Pool\Worker\Work as WorkContract;
use ReactParallel\Pool\Worker\Work\Worker as WorkerInterface;

final class ReturnWorker implements WorkerInterface
{
    public function perform(WorkContract $work): Result
    {
        return new Result($work->work());
    }
}

现在,工厂如何创建工作线程以及它放入其中的内容完全由你决定。由于你已经有 Composer 自动加载器激活,因此你可以像通常那样创建任何对象。

许可证

版权所有 2020 Cees-Jan Kiewiet

特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的任何人免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,以及允许向软件提供的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式,由此软件或软件的使用或其他交易而产生。