【问题标题】:guzzle concurrent request, wait for finished batch before sending nextguzzle 并发请求,等待完成批处理后再发送下一个
【发布时间】:2017-03-07 15:16:00
【问题描述】:

我认为下面的代码会这样工作:

  1. 发送CONCURRENT_REQUESTS数量的批次
  2. 等待所有这些请求完成
  3. 上述号码的下一批已发送
  4. 等等

但实际上,如果我评论第 14 行 [usleep(...)],似乎请求批次会尽可能快地发送,从而向服务器生成数千个查询。 有可能改变它吗?如何改变这种行为?

<?php
$pool = $this->getPool();
if (false !== $pool) {
    $pool->promise()->wait();
}
private function getPool()
{
  $requests = function ($data) {
    foreach ($data as $index => $datum) {
        yield $this->patch($datum)->then(function (
                $response
            ) use ($index) {
                usleep(SLEEP_TIME_IN_SECONDS *1000000);
                return [
                    'response' => $response,
                    'index'    => $index
                ];
            });
        }
    };
    return new EachPromise($requests($data), [
        'concurrency' => CONCURRENT_REQUESTS,
        'fulfilled'   => function ($response, $index) use ($data) {
            // log
        },
        'rejected'    => function ($reason, $index) use ($data) {
            // do stuff
        }
    ]);
}
private function patch($data)
{
    $request = new Request(REQUEST_TYPE_PATCH, $url, $this->getPatchHeaders());
    return $this->client->sendAsync($request);
}

【问题讨论】:

  • 您确定使用 CurlMulti 处理程序吗?您是否安装并启用了 cURL?它不适用于 StreamHandler。

标签: php curl concurrency guzzle guzzle6


【解决方案1】:

它适用于我使用相同(按含义)的代码。

use GuzzleHttp\Client;
use function GuzzleHttp\Promise\each_limit;

$client = new Client();

$requests = function () use ($client) {
    foreach (range(1, 15) as $index) {
        echo "Starting $index query...\n";

        yield $client->getAsync('http://google.com/')
            ->then(function ($response) use ($index) {
                echo "Request $index completed successfully.\n";

                return [
                    'response' => $response,
                    'index'    => $index
                ];
            });
    }
};

$promise = each_limit(
    $requests(),
    3
    // fulfiled
    // rejected
);

$promise->wait();

结果是:

Starting 1 query...
Starting 2 query...
Starting 3 query...
Request 3 completed successfully.
Starting 4 query...
Request 2 completed successfully.
Starting 5 query...
Request 4 completed successfully.
Starting 6 query...
Request 1 completed successfully.
Starting 7 query...
Request 5 completed successfully.
Starting 8 query...
Request 6 completed successfully.
Starting 9 query...
Request 7 completed successfully.
Starting 10 query...
Request 8 completed successfully.
Starting 11 query...
Request 9 completed successfully.
Starting 12 query...
Request 10 completed successfully.
Starting 13 query...
Request 11 completed successfully.
Starting 14 query...
Request 12 completed successfully.
Starting 15 query...
Request 13 completed successfully.
Request 14 completed successfully.
Request 15 completed successfully.

所以它确实有效。请再次检查您的代码。尝试更新到最新版本的 Guzzle(我尝试使用 6.2.2)。

【讨论】:

  • 它不适用于EachPromise。我在两者之间改变了它。改用new Pool 可以。
  • 它适用于我,与我之前的消息中的代码完全相同。结果完全相同。你用修改版吗?不同版本的 Guzzle?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2019-02-11
  • 2020-08-06
  • 2017-01-17
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多