denismitr / async-runner
使用 PCNTL 扩展异步运行 PHP 任务
0.1
2018-05-18 15:09 UTC
Requires
- php: ^7.1
- opis/closure: ^3.0
- symfony/process: ^3.3 || ^4.0
Requires (Dev)
- larapack/dd: ^1.1
- phpunit/phpunit: ^6.0
- symfony/stopwatch: ^4.0
This package is auto-updated.
Last update: 2024-09-23 08:44:58 UTC
README
使用 PCNTL 扩展异步运行 PHP 任务
安装
composer require denismitr/async-runner
使用方法
$wg = WaitGroup::create(); $counter = 0; foreach (range(1, 10) as $i) { $wg->add(function () { usleep(200); // some action here that takes time return 5; })->then(function (int $result) use (&$counter) { $counter += $result; }); } $wg->wait(); $counter; // 50
使用 AsyncTask 继承的示例
// Create a class(es) that inherit from AsyncTask use Denismitr\Async\AsyncTask; class TestAsyncTask1 extends AsyncTask { public function __construct($passSomething) { // Some initialization here } public function run() { usleep(1000); // some action here return 'some result'; } } // Run $wg = WaitGroup::create(); $wg->add(new TestAsyncTask1($passSomething)); $wg->add(new TestAsyncTask2($passSomething)); $results = $wg->wait(); foreach($results as $result) { // gives 2 results of 2 async tasks }
你可以通过 id 检查每个任务的执行结果,以帮助保持执行顺序
$wg = WaitGroup::create(); $idA = $wg->add(new TestAsyncTask('foo'))->getId(); $idB = $wg->add(new TestAsyncTask('bar'))->getId(); $idC = $wg->add(new TestAsyncTask('baz'))->getId(); $results = $wg->wait(); $this->assertEquals('foo', $results[$idA]); $this->assertEquals('bar', $results[$idB]); $this->assertEquals('baz', $results[$idC]);
你可以设置最大并发进程限制
$wg = WaitGroup::create()->setMaxConcurrently(2); $startTime = microtime(true); foreach (range(1, 3) as $i) { $wg->add(function () { sleep(1); }); } $wg->wait(); // Will run only 2 tasks in parallell, then the 3rd one
你可以设置超时时间
$wg = WaitGroup::create()->setTimeout(3); $timedOut = 0; foreach (range(1, 5) as $i) { $wg->add(function () use ($i) { sleep($i); })->timeout(function () use (&$timedOut) { $timedOut += 1; }); } $wg->wait(); $this->assertEquals(3, $timedOut);