【发布时间】:2020-01-14 04:27:32
【问题描述】:
我使用的是 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查询的响应。 任何帮助将不胜感激。
【问题讨论】:
-
不确定这如何适用于您的案例,但您是否尝试过阅读 guzzle 文档。这部分似乎特别符合您的用例,也就是迭代地解决承诺:github.com/guzzle/…
-
这似乎不能解决我的问题。当我想异步和并行执行它们时,这将迫使我按顺序执行所有请求,在我的 doWork 函数中使用它们之前按索引对它们进行排序,然后对一组新请求重复相同的逻辑,直到不再有...
-
您是否尝试过将并发参数设置为 1,所以它会按顺序 1 接 1 处理承诺。我从这个答案中得到了这个stackoverflow.com/questions/40242226/…
-
是的,我已经尝试过了,但是即使所有请求都是按组启动的,我也没有可能检索到订购的结果...例如,我收到了请求的结果2,然后是 3,然后是 4,最后是请求 1 的结果……我期待一个解决方案,允许我按此顺序处理响应 1、2、3、4。