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实现ping
Oct 09 PHP
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
php单例模式的简单实现方法
Jun 10 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
前端性能优化建议
2020/09/17 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python Celery多队列配置代码实例
2019/11/22 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
英语自荐信范文
2013/12/11 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
机械操作工岗位职责
2014/08/08 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
会议主持人开场白台词
2015/05/28 职场文书
python process模块的使用简介
2021/05/14 Python