react-parallel / worker-pool
👷👷♀️👷♂️ 仅用于特定指定任务的worker池
Requires
- php: ^7.4
- ext-parallel: *
- react-parallel/contracts: ^1.0
- react-parallel/event-loop: ^1.0
- react-parallel/react-parallel: ^1.0
- react/event-loop: ^1.1
- react/promise: ^2.7
- wyrihaximus/constants: ^1.5
- wyrihaximus/json-throwable: ^4.0
- wyrihaximus/pool-info: ^1.0
Requires (Dev)
- bruli/php-value-objects: ^2.0
- money/money: ^2.0
- moneyphp/money: ^3.2 || ^3.2.1
- ocramius/package-versions: ^1.4
- react-parallel/infinite-pool: ^2.0
- react-parallel/pool-tests: ^2.0
- wyrihaximus/async-test-utilities: ^2.2
- wyrihaximus/iterator-or-array-to-array: ^1.1
This package is auto-updated.
Last update: 2024-09-15 04:47:29 UTC
README
仅使用一个特定指定任务创建池
安装
要通过 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
特此授予任何获得本软件及其相关文档文件(以下简称“软件”)副本的任何人免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,以及允许向软件提供的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他方式,由此软件或软件的使用或其他交易而产生。