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利用COM对象访问SQLServer、Access
Oct 09 PHP
一个PHP模板,主要想体现一下思路
Dec 25 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP 数组基础知识小结
Aug 20 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
php快递单号查询接口使用示例
May 05 PHP
php中字符串和正则表达式详解
Oct 23 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
php获取linux命令结果的实例
Mar 13 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP递归的三种常用方式
Feb 28 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 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
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
python三元运算符实现方法
2013/12/17 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python学习入门细节知识点
2018/03/29 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
django API 中接口的互相调用实例
2020/04/01 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
C语言编程练习
2012/04/02 面试题
linux面试题参考答案(11)
2012/05/01 面试题
留学自荐信
2013/10/10 职场文书
银行开业庆典方案
2014/02/06 职场文书
房地产项目建议书
2014/03/12 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
管辖权异议上诉状
2015/05/23 职场文书
大学入学感言
2015/08/01 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
MySQL数据库事务的四大特性
2022/04/20 MySQL
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS