【问题标题】:Race between pool requests in GuzzleGuzzle 中的池请求之间的竞争
【发布时间】:2018-09-03 14:07:49
【问题描述】:

我正在使用 guzzle Pool 执行多个 api 并发请求。 一切正常。

但如果有任何请求得到响应,我想停止/避免所有请求。也就是说,我想在请求之间进行一些比赛。是否可以在 laravel 中使用 Guzzle?

这是我到目前为止所做的:

        $requests = function(array $urls){

                foreach ($urls as $url) {

                    yield new Request('GET', $url);

                }

        };


        $pool = new Pool($client, 
                        $requests($urls),

                        [
                            'concurrency' => 5,
                            'fulfilled' => function($response, $index) use ($urls){

                                echo "<br>Completed ".$urls[$index];

                            },

                            'rejected' => function($reason, $index){

                                echo "Rejected ".$index;


                            },
                        ]);


        $promise = $pool->promise();

        $promise->wait();

$urls 是一个 URI 数组

【问题讨论】:

    标签: guzzle guzzle6


    【解决方案1】:

    我认为 Guzzle Pool 的当前实现是不可能的。你唯一能用它做的就是exit;fulfilled 函数中:

    'fulfilled' => function($response, $index) use ($urls){
        echo "Completed " . $urls[$index];
        exit;
     },
    

    在这种情况下,它仍然会发送所有请求,但会在最快响应时立即退出脚本。

    如果没有 Pool,您可以使用 GuzzleHttp\Promise\anyGuzzleHttp\Promise\some 辅助函数:

    use GuzzleHttp\Client;
    use GuzzleHttp\Promise;
    
    $client = new Client(['base_uri' => 'http://site.local/']);
    
    // Initiate each request but do not block
    $promises = [
        'delay3' => $client->getAsync('/async/delay3.php'),
        'delay2' => $client->getAsync('/async/delay2.php'),
        'delay1' => $client->getAsync('/async/delay1.php'),
    ];
    
    //Initiate a competitive race between multiple promises
    $promise = Promise\any($promises)->then(
        function (\GuzzleHttp\Psr7\Response $response) {
            echo "Completed: " . $response->getStatusCode() . "\n";
            echo $response->getBody() ."\n";
        },
        function ($reason) {
            echo $reason;
        }
    );
    
    $results = $promise->wait();
    

    来自GuzzleHttp\Promise\some($count, $promises) 的文档:

    在多个承诺或价值观之间发起竞争 (值将成为立即履行的承诺)。

    当count数量的promise已经实现时,返回的 承诺通过包含履行的数组来履行 获胜者的价值观(按分辨率排序)。

    这个承诺被一个 {@see GuzzleHttp\Promise\AggregateException} 如果已完成的数量 promises 少于所需的 $count。

    来自GuzzleHttp\Promise\any($promises) 的文档:

    像 some(),计数为 1。但是,如果承诺兑现, 履行值不是1的数组,而是直接的值。

    【讨论】:

    • 你能解释一下,任何函数实际上在做什么吗?
    • 感谢您的回复!顺便说一句,可以给我一个重试处理程序的链接,以便与这个 guzzle 并发请求一起使用
    • 你可以使用重试中间件github.com/guzzle/guzzle/blob/master/src/Middleware.php#L155,不知道是不是你需要的。
    猜你喜欢
    • 2020-10-16
    • 2020-08-14
    • 2017-07-09
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多