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 相关文章推荐
第十五节--Zend引擎的发展
Nov 16 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
php实现的CSS更新类实例
Sep 22 PHP
php字符串截取函数用法分析
Nov 25 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
php中二分法查找算法实例分析
Sep 22 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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与MySQL开发的8个技巧小结
2010/12/17 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
python函数的5种参数详解
2017/02/24 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
python滑块验证码的破解实现
2019/11/10 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
千元咖啡店的创业计划书范文
2013/12/29 职场文书
市场部经理岗位职责
2014/04/10 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
Python包argparse模块常用方法
2021/06/04 Python
Redis Cluster 集群搭建你会吗
2021/08/04 Redis