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乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
PHP与SQL语句写一句话木马总结
Oct 11 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 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
重置版宣传动画
2020/04/09 魔兽争霸
PHP中文分词的简单实现代码分享
2011/07/17 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
js Function类型
2011/12/04 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
python实现简单温度转换的方法
2015/03/13 Python
Python 探针的实现原理
2016/04/23 Python
Apache如何部署django项目
2017/05/21 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
卖房协议书
2014/04/11 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
股东授权委托书范本
2014/09/13 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
天堂的孩子观后感
2015/06/11 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android