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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
php创建多级目录代码
Jun 05 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
关于svn冲突的解决方法
Jun 21 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
PHP 读取和编写 XML
2014/11/19 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
js 上传图片预览问题
2010/12/06 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python实现拼接多张图片的方法
2014/12/01 Python
python简单判断序列是否为空的方法
2015/06/30 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
关于.NET, HTML的五个问题
2012/08/29 面试题
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
英文翻译的自我评价语句
2013/10/04 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
创意活动策划书
2014/01/15 职场文书
建筑个人求职信范文
2014/01/25 职场文书
企业文化演讲稿
2014/05/20 职场文书
医院护士工作检讨书
2014/10/26 职场文书
2014年纪检工作总结
2014/11/12 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python