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面试题集锦
Mar 08 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
php判断用户是否手机访问代码
Jun 08 PHP
php实现通过ftp上传文件
Jun 19 PHP
浅谈php7的重大新特性
Oct 23 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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
2019十大人气国漫
2020/03/13 国漫
php的一些小问题
2010/07/03 PHP
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
JS实现图片切换特效
2019/12/23 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python 寻找局部最高点的实现
2019/12/05 Python
python实现图片二值化及灰度处理方式
2019/12/07 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
DataReader和DataSet的异同
2014/12/31 面试题
最新党员思想汇报
2014/01/01 职场文书
离职感谢信
2015/01/21 职场文书
横店影视城导游词
2015/02/06 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers