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学习之PHP变量
Oct 09 PHP
PHP 错误之引号中使用变量
May 04 PHP
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php获得url参数中具有&amp;的值的方法
Mar 05 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
php实现的错误处理封装类实例
Jun 20 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 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将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PDO::exec讲解
2019/01/28 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
javascript 面向对象继承
2009/11/26 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python返回数组/List长度的实例
2018/06/23 Python
Django分页功能的实现代码详解
2019/07/29 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
python Xpath语法的使用
2020/11/26 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
抽奖活动主持词
2014/03/31 职场文书
爱护公物演讲稿
2014/09/09 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
2014年人事科工作总结
2014/11/19 职场文书
亮剑观后感500字
2015/06/05 职场文书
电力培训学习心得体会
2016/01/11 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android