php 异步并行
如果你有一批数据需要调用远程接口处理,而远程接口处理时间很长,比如需要1秒左右,那10条数据就是10秒,你的程序就要10S才能结束,而这样的话一旦接口提供方有点问题,就需要20秒 30秒甚至更久,这样就给我们带来了极大隐患,虽然我们可以使用设置超时来避免这样的长久等待,但是如果串行化不解决的话,程序始终是要长时间等所有任务都结束才能继续判断后面的结果的。
所以这里引入异步概念,用 composer require spatie/async 安装后的 Pool 里面的create 和 async 以及await来解决问题。
例子如下:
我们接口提供方是这样的代码
<?php
sleep(1);
echo json_encode(range(1,15));
exit;
以往我们的调用是这样的
foreach (range(1, 10) as $v) {
$list[] = file_get_contents("http://localhost/index.php?act=" . $v);
}
那就是按顺序调用接口,统计下来耗时 10021 ms 也就是10秒
现在我们可以这样做
<?php
include "vendor/autoload.php"; use Spatie\Async\Pool;
$pool = Pool::create();
foreach (range(1, 10) as $item) {
$pool[] = async(function () use ($item) {
return file_get_contents("http://localhost/index.php?act=" . $item);
})->then(function (string $output) use(&$list) {
$list[] = $output;
});
}
await($pool);
发现耗时 1341 ms,也就是说基本上是9-10个在同时并行请求,节省了很多时间。
我测试了一下如果不是在循环里面调用接口,而是简单的做一个item*2的数学运算,那同步可快多了,异步可慢多了。
<?php
include "vendor/autoload.php"; use Spatie\Async\Pool;
$pool = Pool::create();
foreach (range(1, 10) as $item) {
$pool[] = async(function () use ($item) {
return $item * 2;
})->then(function (string $output) use(&$list) {
$list[] = $output;
});
}
await($pool);
耗时 324 ms
而同步的嘛,只要 0.0019 ms
<?php
foreach (range(1, 10) as $v) {
$list[] = 2 * $v;
}
毕竟这种情况下多余的异步开销反而不如同步啊。
适用场景就是多数据量,长耗时任务被阻塞等待,那这个时候用这个东西缓解一下压力,提高一下速度还是不错的。
php 异步并行的更多相关文章
- TPL异步并行编程之取消任务
TPL异步并行编程之简单使用 在上篇随笔里面说明了Task的使用,仅仅是简单使用,有时候把一个任务交给Task去执行,但是呢还是要管理下,比如说:我要叫这个任务停止了,不做了,任务取消了,或者超时了 ...
- Python之多进程&异步并行
由于python的gil,多线程不是cpu密集型最好的选择 多进程可以完全独立的进程环境中运行程序,可以充分的利用多处理器 但是进程本身的隔离带来的数据不共享也是一个问题,而且线程比进程轻量 impo ...
- php的异步并行扩展swoole
Swoole是PHP的异步并行扩展,有点像Node.js,但swoole既支持同步又支持异步,比node更强大.Swoole扩展是基于epoll高性能事件轮询,并且是多线程的,性能非常好. Swool ...
- 如何让 FFmpeg 支持异步并行转码、截图等等操作?
直接贴代码了: ffmpegTest02.cs public partial class ffmpegTest02 : FormBase { private static readonly strin ...
- TPL异步并行编程之回调
Task是基于ThreadPool线程池基础上的高度异步多线程编程,如果有一天我希望一个需要长时间运行的Task,在被某些异常终止后还能回调一些代码就可以知道Task终止的原因了吧 是的,且看代码 p ...
- TPL异步并行编程之任务超时
此处参考自阿涛的博文:http://www.cnblogs.com/HelloMyWorld/p/5526914.html 一 自己定义 基本的思路: net中异步操作由于是交给线程来实现,因此不可能 ...
- TPL异步并行编程之简单使用
并行编程一直是一个老生常谈的话题 在这里记录一下TPL编程,这在net4.0 微软就已经提供了多核时代下的并行库,其中最核心的最常用的也就是Task 一 Task是什么 Task可以简单的理解为一个线 ...
- PHP 的异步并行 C 扩展 Swoole
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- PHP 的异步并行和协程 C 扩展 Swoole (附链接)
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- RPC 使用中的一些注意点
最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...
随机推荐
- 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问
问题描述 对Azure上的虚拟机资源,需要进行安全管理.只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上, 有如下几点考虑: 1) 使用Azure Policy服务,扫描订阅中全部的网络安全组 ...
- 【YashanDB知识库】ODBC驱动类问题定位方法
[标题]ODBC驱动类问题定位方法 [需求分类]故障分析 [关键字]ODBC [需求描述]由于我们的ODBC接口目前尚不完善,经常会遇见ODBC接口能力不足导致应用功能无法运行的问题,需要定位手段确定 ...
- Opensack-T版脚本安装
openStack-train 搭建部署 项目环境: 主机名 外网口(net) 内口(仅主机)s 配置 controller 192.168.220.10/192.168.220.1/24 192.1 ...
- TypeScript 5.1 & 5.2
getter 和 setter 可以完全不同类型了 以前我们提过,getter 的类型至少要是其中一个 setter 的类型.这个限制被突破了.现在可以完全使用不同类型了. v5.1 后,没有再报错了 ...
- DOM – Work with Document.styleSheets and JS/Scss Breakpoint Media Query
前言 为了方便管理, 我们会定义 CSS Variables, 类似于全局变量. 有时候做特效的时候还需要 JavaScript 配合, 这时就会希望 JavaScript 可以获取到 CSC Var ...
- 1Panel:一个现代化、开源的 Linux 服务器运维管理面板
前言 之前有小伙伴问:Linux 服务器运维管理除了宝塔,还有其他值得推荐的管理软件吗?,今天大姚给大家分享一个现代化.开源的 Linux 服务器运维管理面板:1Panel. 项目介绍 1Panel是 ...
- freemarker实现导出word复选框可点击效果
记一次java导出word文档,导出的word文档里包含复选框并且能点击,一开始做了个输出字符的,比如这样: □,然而并不能满足需求,网上找了一大堆也都是这种的. 正文开始: 先在word中添加复选框 ...
- .NET 跨平台工业物联网网关解决方案
前言 随着工业4.0时代的到来,物联网技术正在以前所未有的速度改变着我们的生产和生活方式.本文给大家介绍一个基于 .NET 6 开发的跨平台工业物联网网关解决方案. 工业物联网(IIoT)成为了连接物 ...
- 一些git使用命令,误删本地分支,如何找回
1.新建仓库 git init 2.如果要本地更改文件,需要更新到远端. git status # 查看当前文件状态 git add -A # "git add -A" 命令用于将 ...
- dotnet定义扩展方法
// 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充