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基础知识:类与对象(1)
Dec 13 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
php fread读取文件注意事项
Sep 24 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
PHP 字符串操作入门教程
2006/12/06 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
基于jquery的表头固定的若干方法
2011/01/27 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
python 用struct模块解决黏包问题
2020/11/07 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
公司应聘自荐书
2014/06/14 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
离婚协议书样本
2015/01/26 职场文书
应聘教师求职信范文
2015/03/20 职场文书
高三化学教学反思
2016/02/22 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL