测试环境:

  1. PHP版本:php7.0.10
  2. mysql版本:5.7.14

测试用例:循环插入两千行数据到数据库

    public function test_syn($pc){

       // $pc = trim(I('pc'));

       $model = M('','');

       $model -> startTrans();
try{
$sql = 'update d_fhditem set num = num +1 where id= 1365';
$res = $model -> execute($sql);
}catch(\Exception $e){
$res = false;
} if($res === false){
$model -> rollback();
echo '更新失败<br>';
die;
} try{
$sql = 'insert into check_thread_log(`pc`) values('.$pc.')';
$res = $model -> execute($sql);
}catch(\Exception $e){
$res = false;
} if($res === false){
$model -> rollback();
echo '添加事务失败<br>';
die;
} $res = $model -> commit();
if($res === false){
$model -> rollback();
echo '提交事务失败';
} //echo '测试成功'.$pc.'<br>';
}

测试一:一次生成2000个curl句柄,同时运行

    public function checkThread3(){
$t = microtime(true);
$row = 2000;
$i = 0;
$arr_handle = array();
while($i < $row){
$res = $res.$i;
$res = curl_init();
$url = 'http://localhost/InTimeCommnuicate/index.php/Home/WebstockApi/test_syn/pc/'.$i;
curl_setopt($res, CURLOPT_URL , $url);
curl_setopt($res, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($res, CURLOPT_HEADER, 0); $arr_handle[] = $res;
$i++;
} $cmi = curl_multi_init(); //添加2000条句柄
foreach($arr_handle as $k => $v){ curl_multi_add_handle($cmi, $v); } $still_running = null; do{ usleep(10000);
$res = curl_multi_exec($cmi, $still_running); $j++;
}while($still_running > 0); foreach($arr_handle as $v){
curl_multi_remove_handle($cmi, $v);
}
curl_multi_close($cmi); $t1 = microtime(true);
echo '<hr>并发执行时间:'.($t1 - $t).'<br>';
}

  

  运行结果:

mysql查询:

小结:从结果可以看出,当同时运行的数量过大时会有部分丢失。

测试二:对程序进行部分改进,把并发数量控制在400条以内

    public function checkThread(){
$t = microtime(true);
$row = 2000;
$i = 0;
$arr_handle = array();
while($i < $row){
$res = $res.$i;
$res = curl_init();
$url = 'http://localhost/InTimeCommnuicate/index.php/Home/WebstockApi/test_syn/pc/'.$i;
curl_setopt($res, CURLOPT_URL , $url);
curl_setopt($res, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($res, CURLOPT_HEADER, 0); $arr_handle[] = $res;
$i++;
} $cmi = curl_multi_init();
//最大并发数
$maxRunHandle = 400;
//当前添加句柄
$thisAddHandle = 0;
//需要运行条数
$maxRow = count($arr_handle);
//添加400条句柄
foreach($arr_handle as $k => $v){
if($k >= $maxRunHandle) break;
curl_multi_add_handle($cmi, $v);
$thisAddHandle++; } $still_running = null;
$j = 1; do{
//当运行并发数小于400且并发
if($still_running < 400 && $thisAddHandle < $maxRow){
curl_multi_add_handle($cmi, $arr_handle[$thisAddHandle]);
$thisAddHandle++;
} usleep(10000);
$res = curl_multi_exec($cmi, $still_running);
// echo '第'.$j.'次输并发执行的句柄数量为'.$still_running.'<br>';
$j++;
}while($still_running > 0); foreach($arr_handle as $v){
curl_multi_remove_handle($cmi, $v);
}
curl_multi_close($cmi); $t1 = microtime(true);
echo '<hr>并发执行时间:'.($t1 - $t).'<br>';
}

  运行结果:

mysql查询:

小结:可以看出运行速度比原来的快,而且没有任何的数据丢失。

测试三:不使用curl函数,直接插入2000行数据

    public function checkThread2(){
$t = microtime(true);
$row = 2000;
$i = 0;
while($row > $i){
$this -> test_syn($i);
$i++;
} $t1 = microtime(true);
echo '<hr>while循环时间'.($t1 - $t).'<br>';
}

  结果:

mysql查询:

curl_multi_*模拟多线程异步用法的更多相关文章

  1. 通过curl模拟多线程抓取网页(curl_multi_*)

    curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...

  2. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...

  3. 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)

    可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...

  4. 【JavaScript】吃饱了撑的系列之JavaScript模拟多线程并发

    前言 最近,明学是一个火热的话题,而我,却也想当那么一回明学家,那就是,把JavaScript和多线程并发这两个八竿子打不找的东西,给硬凑了起来,还写了一个并发库concurrent-thread-j ...

  5. Java使用多线程异步执行批量更新操作

    import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ...

  6. php模拟多线程

    一:应该知道的: php本身是不支持多线, 但是php的好搭档,apache和linux是支持的,故lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧.既然是模拟的, 就不是真 ...

  7. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  8. C# 多线程 异步加载 窗体

    C# 多线程 异步加载 窗体 分类: C#2014-05-28 16:57 1286人阅读 评论(0) 收藏 举报 异步加载 我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗 ...

  9. shell 中用管道模拟多线程

    shell 中用管道模拟多线程 这里以两个例子来对比多线程和单进程 单线程的例子 # config.txt在这个例子和多线程的例子中都会用到 [root@ns_10.2.1.242 test]$ ca ...

随机推荐

  1. numpy-np.ceil,np.floor,np.expand_dims方法

    np.ceil(多维数组):对多维数组的各个数向上取整 np.floor(多维数组):对多维数组的各个数向下取整 np.expand_dims(x,axis = 0):在x的第一维度上插入一个维度,a ...

  2. ROS基础-基本概念和简单工具(1)

    1.什么是ROS? Robot operating System ,简单说机器人操作系统,弱耦合的分布式进程框架,通过进程间的消息传递和管理.实现硬件抽象和设备控制. 2.节点(node) node ...

  3. Docker 系列之 常用镜像

    Ubuntu 实战 操作 # 拉取 18.04 版本的 Ubuntu 镜像 docker pull ubuntu:latest # 以交互方式运行并进入 ubuntu 容器环境 docker run ...

  4. 什么是EAC模型

    在20世纪70年代末,一个心理学学生理查德•班德勒和一个语言学学生约翰•格林德提出了一个EAC模型,即眼睛解读线索.这个模型对不同的感官和思维方式之间进行一些有效的研究, 对于大部分的人来说,左边往往 ...

  5. 资深程序员告诉你为什么要用Python3而不是Python2

    经常遇到这样的问题:<现在开始学习python的话,是学习python2.x还是学习python3.x比较好?>,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助 ...

  6. GO语言介绍以及开发环境配置

    一.介绍 GO语言是静态强类型语言 静态也就是编译型语言 二.安装 1.下载地址 下载地址 https://golang.google.cn/dl/ 2.安装 Linux安装 1.下载二进制包:go1 ...

  7. netcore3.0使用Session

    首先需要明确一点,netcore使用session不能直接使用,必须引用nuget包并做注册之后才能使用. 例如下面的例子,若未注册session服务会报 HttpContext.Session.Se ...

  8. Linux-3.14.12内存管理笔记【构建内存管理框架(4)】

    虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),但这里不准备复述什么,仅针对required_movablecore和required_ ...

  9. 『003』Shell命令

    『001』索引-Linux Shell Command shell命令 <01>[线上查询及帮助][001]-[001] [001]- 点我快速打开文章[man][help][已改版] & ...

  10. MATLAB实例:Munkres指派算法

    MATLAB实例:Munkres指派算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 指派问题陈述 指派问题涉及将机器分配给任务,将工人分配给 ...