/** * @return PromiseInterface */ protected function requeue() { if ($this->queue->count() === 0) { return new FulfilledPromise(); } return \React\Promise\resolve($this->queue->dequeue())->then(function (Rpc $rpc) { return \React\Promise\resolve($this->memory->enqueue($rpc)); }); }
/** * @param ProcessCollectionInterface $processCollection * @param LoopInterface $loop * @param array $options */ public function __construct(ProcessCollectionInterface $processCollection, LoopInterface $loop, array $options = []) { $this->loop = $loop; $this->options = $options; $this->queue = \WyriHaximus\React\ChildProcess\Pool\getQueue($this->options, 'WyriHaximus\\React\\ChildProcess\\Pool\\Queue\\Memory', $loop); $this->manager = \WyriHaximus\React\ChildProcess\Pool\getManager($this->options, $processCollection, 'WyriHaximus\\React\\ChildProcess\\Pool\\Manager\\Fixed', $loop); $this->manager->on('ready', function (WorkerInterface $worker) { $this->emit('worker', [$worker]); if ($this->queue->count() === 0) { return; } \React\Promise\resolve($this->queue->dequeue())->then(function (Rpc $message) use($worker) { $hash = spl_object_hash($message); $this->deferreds[$hash]->resolve($worker->rpc($message)); unset($this->deferreds[$hash]); }); }); }
/** * @dataProvider queueProvider */ public function testOperations(QueueInterface $queue) { $rpc0 = Factory::rpc('a', ['b']); $rpc1 = Factory::rpc('c', ['d']); $rpc2 = Factory::rpc('e', ['f']); $this->assertSame(0, $queue->count()); $queue->enqueue($rpc0); $this->assertSame(1, $queue->count()); $queue->enqueue($rpc1); $this->assertSame(2, $queue->count()); $queue->enqueue($rpc2); $this->assertSame(3, $queue->count()); $this->assertSame(json_encode($rpc0), json_encode($this->dequeue($queue->dequeue()))); $this->assertSame(2, $queue->count()); $this->assertSame(json_encode($rpc1), json_encode($this->dequeue($queue->dequeue()))); $this->assertSame(1, $queue->count()); $this->assertSame(json_encode($rpc2), json_encode($this->dequeue($queue->dequeue()))); $this->assertSame(0, $queue->count()); }