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入门
Oct 09 PHP
PHP4中session登录页面的应用
Jul 25 PHP
php SQL之where语句生成器
Mar 24 PHP
Windows下XDebug 手工配置与使用说明
Jul 11 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
使用GD库生成带阴影文字的图片
Mar 27 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
PHP常用的三种设计模式
Feb 17 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
XAMPP安装与使用方法详细解析
2013/11/27 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
js运动事件函数详解
2016/10/21 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
js编写简易的计算器
2020/07/29 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
Python常用库推荐
2016/12/04 Python
Python之str操作方法(详解)
2017/06/19 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
iPython pylab模式启动方式
2020/04/24 Python
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
人力资源专业推荐信
2013/11/29 职场文书
中国央视网签名寄语
2014/01/18 职场文书
市场部规章制度
2014/01/24 职场文书
询价采购方案
2014/06/09 职场文书
大学生求职信例文
2014/06/29 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
小学生学习保证书
2015/02/26 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
原生JS实现分页
2022/04/19 Javascript
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript