php - 如何使用 Guzzle 异步获取执行查询并按正确顺序处理它们?
问题描述
我正在使用 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 查询的响应。任何帮助将不胜感激。
解决方案
我终于解决了我的问题。
不确定这是否是最好的方法,但它有效:我已经设置了一个全局结果数组,并在调用出列函数之前将结果累积在数组中,以便按升序遍历数组。最初在结果数组开头的索引标志让我知道要处理的最小非空结果有点像冒泡排序算法。
推荐阅读
- python - django 复制迁移表的模型名称
- wordpress - WPBakery - 在手机上查看页面时文本字体大小很小
- linux - 在 @INC 中找不到 ExtUtils/MakeMaker.pm
- pytorch - 为什么 torch.functional.sigmoid 和 torch.nn.functional.relu 不像 torch.nn.functional.tanh 那样被弃用?
- javascript - 混淆了 promise 和 async/await
- scrapy - 使用带有规则的 start_requests 进行 Scrapy
- ubuntu - MariaDB 使用所有可用的内存
- python - 计算目录和子目录中的文件数
- php - Bootstrap Studio 需要哪些导出设置
- bash - 如何将可能包含引号和非 ASCII 字符的参数从 PowerShell 传递到外部程序?