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 相关文章推荐
PHP4 与 MySQL 交互使用
Oct 09 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
处理单名多值表单的详解
Jun 08 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
php数组去除空值函数分享
Feb 02 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
smarty的section嵌套循环用法示例
May 28 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 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
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
js中apply和call的理解与使用方法
2019/11/27 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python django集成cas验证系统
2014/07/14 Python
python selenium 弹出框处理的实现
2019/02/26 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
介绍信的格式
2015/01/30 职场文书
家长会感言
2015/08/01 职场文书
python3操作redis实现List列表实例
2021/08/04 Python