public function testSpeed() { $queueTypes = ['redis', 'predis', 'rabbitMQ']; $queueFactory = new QueueFactory(); $messageCount = 200; $threadCount = 4; $type = 'benchmark-sum'; $workerScript = __DIR__ . '/benchmark-worker.php'; $results = []; foreach ($queueTypes as $queueType) { $queue = $queueFactory->make($queueType); $transformer = new TaskMessageSerializeTransformer(); $executor = new Executor(new TaskScheduler($queue, $transformer, $transformer)); /** @var Process[] $threads */ $threads = []; for ($i = 0; $i < $threadCount; $i++) { $thread = new Process('php ' . $workerScript . ' ' . $queueType . ' ' . $type); $thread->start(); $threads[] = $thread; } sleep(1); $stopwatch = Stopwatch::createStarted(); /** @var FutureResult[] $futureResults */ $futureResults = []; for ($i = 0; $i < $messageCount; $i++) { $futureResults[] = $executor->submit($type, SumTask::class, [$i, $i + 1]); } $stopwatch->pause(); $submitTime = $stopwatch->getElapsedSeconds(); $stopwatch->resume(); foreach ($futureResults as $futureResult) { $futureResult->getResult(); } $stopwatch->stop(); $totalTime = $stopwatch->getElapsedSeconds(); foreach ($threads as $thread) { $thread->stop(); } $results[$queueType] = [$totalTime, $submitTime]; } foreach ($results as $queueType => list($totalTime, $submitTime)) { $this->assertGreaterThan(0, $totalTime); $totalTime = number_format($totalTime, 2); $submitTime = number_format($submitTime, 2); echo "{$queueType}: total = {$totalTime} seconds, submit = {$submitTime} seconds\n"; } }
<?php use ParallelTask\Benchmark\QueueFactory; use ParallelTask\Task\TaskFactorySimple; use ParallelTask\Task\TaskMessageSerializeTransformer; use ParallelTask\Task\TaskRunner; use ParallelTask\Worker; require_once dirname(__DIR__) . '/../vendor/autoload.php'; $queueType = $argv[1]; $type = $argv[2]; $queueFactory = new QueueFactory(); $queue = $queueFactory->make($queueType); $transformer = new TaskMessageSerializeTransformer(); $taskFactory = new TaskFactorySimple(); $supervisor = new \ParallelTask\Task\TaskRunnerNullSupervisor(); $worker = new Worker(new TaskRunner($queue, $transformer, $taskFactory, $transformer, $supervisor)); $worker->work($type);