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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
php抓取页面的几种方法详解
Jun 17 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
实例讲解PHP表单处理
Feb 15 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
javascript实现yield的方法
2013/11/06 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
工作表扬信的范文
2014/01/10 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
小学生寒假家长评语
2014/04/16 职场文书
党员民主评议总结
2014/10/20 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
Django操作cookie的实现
2021/05/26 Python
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL