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 编写的日历
Oct 09 PHP
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
PHP Directory 函数的详解
Mar 07 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
php简单生成一组与多组随机字符串的方法
May 09 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 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
几个php应用技巧
2008/03/27 PHP
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
Symfony的安装和配置方法
2016/03/17 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
简单了解python反射机制的一些知识
2019/07/13 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
Django实现简单的分页功能
2021/02/22 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
会展中心部门工作职责
2013/11/27 职场文书
2014年城管工作总结
2014/11/20 职场文书
服务明星事迹材料
2014/12/29 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
国庆阅兵观后感
2015/06/15 职场文书
2016党员入党决心书
2015/09/22 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js