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生成自己的LOG文件
Oct 09 PHP
PHP初学者头疼问题总结
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
解析ajax事件的调用顺序
Jun 17 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
重新认识php array_merge函数
Aug 31 PHP
php实现的zip文件内容比较类
Sep 24 PHP
php中curl使用指南
Feb 05 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
php cli配置文件问题分析
Oct 15 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
Mar 14 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 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
用PHP调用数据库的存贮过程!
2006/10/09 PHP
SSI指令
2006/11/25 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
使用PHP开发留言板功能
2019/11/19 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
python操作mysql代码总结
2018/06/01 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python实现3D地图可视化
2020/03/25 Python
python实现手势识别的示例(入门)
2020/04/15 Python
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
校园报刊亭的创业计划书
2014/01/02 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
归途列车观后感
2015/06/17 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技
python数据处理之Pandas类型转换
2022/04/28 Python