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中的超全局变量
Oct 09 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
利用PHP实现短域名互转
Jul 05 PHP
php实现将Session写入数据库
Jul 26 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
PHP邮件群发机实现代码
Feb 16 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
PHP之十六个魔术方法详细介绍
Nov 01 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 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
一个域名查询的程序
2006/10/09 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
dwr spring的集成实现代码
2009/03/22 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
js创建对象的方式总结
2015/01/10 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python模块之StringIO使用示例
2015/04/08 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
汽车广告策划方案
2014/05/31 职场文书
学校运动会报道稿
2014/09/23 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
商超业务员岗位职责
2015/02/13 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Java设计模式之享元模式示例详解
2022/03/03 Java/Android