我使用的是Guzzle版本6,我希望以并行的方式异步发送所有请求,并以与查询相同的顺序对响应进行一些处理。
例如,如果我查询url-1到url-8,我希望以任意顺序异步解析前四个查询(url-1到url-4),然后按正确的升序处理url-response-body-1到url-response-body-4。然后接下来的四个查询(url-5到url-8)也将被异步解析,依此类推……
我知道我可以以任何方式将查询的所有响应存储在内存中,然后在进行所有查询时处理它们,但我希望能够占用较小的内存空间和低延迟代码。
到目前为止,我使用的代码如下:
$url_arr = array("/home_search.php?q=criteria1","/home_search.php?q=criteria2","/home_search.php?q=criteria3","/home_search.php?q=criteria4","/home_search.php?q=criteria5","/home_search.php?q=criteria6");
$promises = (function () use ($url_arr,$client) {
foreach ($url_arr as $uri) {
// don't forget using generator
yield $client->getAsync( $uri);
}
})();
$eachPromise = new EachPromise($promises, [
// how many concurrency we are use
'concurrency' => 4,
'fulfilled' => function (Response $response) {
doMyWork($response->getBody());
},
'rejected' => function ($reason) {
// handle promise rejected here
}
]);
$eachPromise->promise()->wait();问题是函数doMyWork以任何顺序接收响应,例如,它有时在第一个url get查询之前接收第二个url get查询的响应。任何帮助都将不胜感激。
发布于 2020-01-14 04:27:33
我终于解决了我的问题。
我不确定这是否是最好的方法,但它是有效的:我设置了一个全局结果数组,并在每个promise的末尾将结果累积到数组中,然后调用一个dequeue函数,以便以升序遍历该数组。结果数组开头的索引标志让我知道要处理的最小非空结果,有点像冒泡排序算法。
https://stackoverflow.com/questions/59702243
复制相似问题