Я работаю над процессом, в котором у меня есть Очередь , и я начинаю с известной единицы работы.Когда я обрабатываю единицу работы, это приведет к нулю или более (неизвестным) единицам работы, которые будут добавлены в Очередь .Я продолжаю обрабатывать очередь до тех пор, пока не останется больше работы.
Я работаю над проверкой концепции , используя Guzzle, где я принимаю первый URL для заполнения очереди,затем обработайте тело ответа, которое может привести к большему количеству URL, которые необходимо обработать.Моя цель - добавить их в очередь и заставить Guzzle продолжать обрабатывать их, пока в очереди ничего не останется.
В других случаях я могу определить переменную как очередь и передать ее по ссылке вфункция, так что он обновляется с новой работой.Но в случае с Guzzle Async Pools (который я считаю наиболее эффективным способом справиться с этим), кажется, нет ясного способа обновить очередь в процессе и выполнить пулзапросы.
Предоставляет ли Guzzle встроенный подход для обновления списка запросов пула из выполненного обратного вызова Promise ?
use ArrayIterator;
use GuzzleHttp\Promise\EachPromise;
use GuzzleHttp\TransferStats;
use Psr\Http\Message\ResponseInterface;
// Re-usable callback which prints the URL being requested
function onStats(TransferStats $stats) {
echo sprintf(
'%s (%s)' . PHP_EOL,
$stats->getEffectiveUri(),
$stats->getTransferTime()
);
}
// The queue of work to be performed
$requests = new ArrayIterator([
$client->get('http://httpbin.org/anything', [
'on_stats' => 'onStats',
])
]);
// Process the queue, which results in more work to be performed
$p = (new EachPromise($requests, [
'concurrency' => 50,
'fulfilled' => function(ResponseInterface $response) use ($client, &$requests) {
$hash = bin2hex(random_bytes(10));
$requests[] = $client->get(sprintf('http://httpbin.org/anything/%s', $hash), [
'on_stats' => 'onStats',
]);
},
'rejected' => function($reason) {
echo $reason . PHP_EOL;
},
]))->promise();
// Wait for everything to finish
$p->wait(true);
Похоже, мой вопросбыть похожим на Инкрементно добавлять запросы в пул Guzzle 5.0 (Rolling Requests) , но отличается тем, что они относятся к различным основным версиям Guzzle.