Оно работает. Спасибо за ваше решение.

ема

Мы пытаемся выполнять параллельные асинхронные запросы, используя guzzle. Пройдя через несколько ресурсов, какэто а такжеэто, мы придумали некоторый код, которым делятся ниже. Однако это не работает, как ожидалось.

Похоже, что Guzzle выполняет эти запросы синхронно, а не асинхронно.

ожидание

Просто для целей тестирования мы нажимаем внутренний URL, который спит 5 секунд. При параллельности 10 мы ожидаем, что все 10 запросов будут изначально поставлены в очередь и отправлены на сервер.почти одновременно, где они будут ждать в течение 5 секунд, а затем будетпочти все они закончатся почти одновременно. Который заставил бы клиент-жадник забрать 10 новых запросов от итератора и так далее.

Код
    $iterator = function() {
        $index = 0;
        while (true) {
            $client = new Client(['timeout'=>20]);
            $url = 'http://localhost/wait/5' . $index++;
            $request = new Request('GET',$url, []);
            echo "Queuing $url @ " . (new Carbon())->format('Y-m-d H:i:s') . PHP_EOL;
            yield $client
                ->sendAsync($request)
                ->then(function(Response $response) use ($request) {
                    return [$request, $response];
                });
        }
    };

    $promise = \GuzzleHttp\Promise\each_limit(
        $iterator(),
        10,  /// concurrency,
        function($result, $index) {
            /** GuzzleHttp\Psr7\Request $request */
            list($request, $response) = $result;
            echo (string) $request->getUri() . ' completed '.PHP_EOL;
        },
        function(RequestException $reason, $index) {
            // left empty for brevity
        }
    );
    $promise->wait();
Фактические результаты

Мы находим, что этот Guzzle никогда не делал второй запрос, пока первый не закончен. и так далее.

Queuing http://localhost/wait/5/1 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/2 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/3 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/4 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/5 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/6 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/7 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/8 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/9 @ 2017-09-01 17:15:28
Queuing http://localhost/wait/5/10 @ 2017-09-01 17:15:28
http://localhost/wait/5/1 completed
Queuing http://localhost/wait/5/11 @ 2017-09-01 17:15:34
http://localhost/wait/5/2 completed
Queuing http://localhost/wait/5/12 @ 2017-09-01 17:15:39
http://localhost/wait/5/3 completed
Queuing http://localhost/wait/5/13 @ 2017-09-01 17:15:45
http://localhost/wait/5/4 completed
Queuing http://localhost/wait/5/14 @ 2017-09-01 17:15:50 

ОС / Информация о версии

UbuntuPHP / 7.1.3GuzzleHttp / 6.2.1локон / 7.47.0

Проблема может быть связана с \ GuzzleHttp \ Promise \ each_limit .., который, возможно, не инициирует или не решает обещание достаточно быстро. Вполне возможно, что мы должны обмануть это вtickвнешне.

Ответы на вопрос(1)

Ваш ответ на вопрос