php 多进程编程父进程的阻塞与非阻塞实例分析


Posted in PHP onFebruary 22, 2020

本文实例讲述了php 多进程编程父进程的阻塞与非阻塞。分享给大家供大家参考,具体如下:

php中进程的阻塞,主要是父进程等待子进程退出。

1.php代码如下:

<?php

//定义进程数量
define('FORK_NUMS', 5);

//用于保存进程pid
$pids = array();

//我们创建5个子进程
for ($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if ($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {
    //这里是父进程空间,也就是主进程
    //我们的for循环第一次进入到这里时,pcntl_wait会挂起当前主进程,等待第一个子进程执行完毕退出
    //注意for循环的代码是在主进程的,挂起主进程,相当于当前的for循环也阻塞在这里了
    //第一个子进程退出后,然后再创建第二个子进程,到这里后又挂起,等待第二个子进程退出,继续创建第三个,等等。。
    pcntl_wait($status);
  } else {
    //这里是子进程空间
    echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n";
    //我们让子进程等待3秒,再退出
    sleep(3);
    exit;
  }
}

上面代码结果如下:

php 多进程编程父进程的阻塞与非阻塞实例分析

如果我们把pcntl_wait拿到for循环外,会是个什么结果?

2.php代码如下:

<?php

//定义进程数量
define('FORK_NUMS', 5);

//用于保存进程pid
$pids = array();

//我们创建5个子进程
for ($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if ($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {

  } else {
    //这里是子进程空间
    echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n";
    //我们让子进程等待3秒,再退出
    sleep(3);
    exit;
  }
}

//我们把pcntl_waitpid放到for循环外面,那样在for循环里创建子进程就不会阻塞了
//但是在这里仍会阻塞,主进程要等待5个子进程都退出后,才退出。
foreach ($pids as $pid) {
  pcntl_waitpid($pid, $status);
}

上面代码结果如下:

php 多进程编程父进程的阻塞与非阻塞实例分析

pcntl_wait的第二个参数可以用来设置主进程不等待子进程退出,继续执行后续代码。

3.php代码如下:

<?php

//定义进程数量
define('FORK_NUMS', 5);

//用于保存进程pid
$pids = array();

//我们创建5个子进程
for ($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if ($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {
    //这里是父进程空间,也就是主进程
    //这里与1.php的代码只有一点不同,就是加了第二个参数WNOHANG
    //for循环到这里时,就不会挂起主进程,而是继续执行后续代码
    pcntl_wait($status, WNOHANG);
  } else {
    //这里是子进程空间
    echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n";
    //我们让子进程等待3秒,再退出
    sleep(3);
    exit;
  }
}

//在这里我们等待10秒,不然子进程还没执行完,主进程就退出了,看不出效果
sleep(10);

上面代码结果如下:

php 多进程编程父进程的阻塞与非阻塞实例分析

代码3.php与2.php效果一样,pcntl_wait()函数的作用只是用来让父进程等待子进程退出,默认情况下会阻塞主进程。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
社区(php&amp;&amp;mysql)六
Oct 09 PHP
PHP5 安装方法
Jan 15 PHP
php中的实现trim函数代码
Mar 19 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
Jul 18 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
两种设置php载入页面时编码的方法
Jul 29 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
php7 图形用户界面GUI 开发示例
Feb 22 #PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 #PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 #PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 #PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 #PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 #PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 #PHP
You might like
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
js如何打印object对象
2015/10/16 Javascript
js实现图片轮播效果
2015/12/19 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
浅入深出Vue之组件使用
2019/07/11 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
理解Python中的With语句
2015/02/02 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
python3 pygame实现接小球游戏
2019/05/14 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
python获取Linux发行版名称
2019/08/30 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
python中安装django模块的方法
2020/03/12 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
德育标兵事迹材料
2014/08/24 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
律师催款函范文
2015/06/24 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书