首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步获取execute查询并用Guzzle按正确的顺序处理它们?

如何异步获取execute查询并用Guzzle按正确的顺序处理它们?
EN

Stack Overflow用户
提问于 2020-01-12 16:40:26
回答 1查看 48关注 0票数 0

我使用的是Guzzle版本6,我希望以并行的方式异步发送所有请求,并以与查询相同的顺序对响应进行一些处理。

例如,如果我查询url-1到url-8,我希望以任意顺序异步解析前四个查询(url-1到url-4),然后按正确的升序处理url-response-body-1到url-response-body-4。然后接下来的四个查询(url-5到url-8)也将被异步解析,依此类推……

我知道我可以以任何方式将查询的所有响应存储在内存中,然后在进行所有查询时处理它们,但我希望能够占用较小的内存空间和低延迟代码。

到目前为止,我使用的代码如下:

代码语言:javascript
复制
$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查询的响应。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 04:27:33

我终于解决了我的问题。

我不确定这是否是最好的方法,但它是有效的:我设置了一个全局结果数组,并在每个promise的末尾将结果累积到数组中,然后调用一个dequeue函数,以便以升序遍历该数组。结果数组开头的索引标志让我知道要处理的最小非空结果,有点像冒泡排序算法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59702243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档