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 相关文章推荐
对盗链说再见...
Oct 09 PHP
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
dedecms模版制作使用方法
Apr 03 PHP
改变Apache端口等配置修改方法
Jun 05 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
php cookie用户登录的详解及实例代码
Jan 03 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
php 购物车实例(申精)
2009/05/11 PHP
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
Destoon实现多表查询示例
2014/08/21 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
PHP闭包函数详解
2016/02/13 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
浅析PEP572: 海象运算符
2019/10/15 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
四年的个人工作自我评价
2013/12/10 职场文书
新护士岗前培训制度
2014/02/02 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
消防宣传语大全
2015/07/13 职场文书
党章学习心得体会2016
2016/01/14 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript