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 存取 MySQL 数据库的一个例子
Oct 09 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
php中error与exception的区别及应用
Jul 28 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php实现的click captcha点击验证码类实例
Sep 23 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
十天学会php之第七天
2006/10/09 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
PHP代码优化技巧小结
2015/09/29 PHP
JavaScript 事件系统
2010/07/22 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python 初始化多维数组代码
2008/09/06 Python
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
python中xrange和range的区别
2014/05/13 Python
python3中int(整型)的使用教程
2017/03/23 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
详解Python3注释知识点
2019/02/19 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
申请任职学生会干部自荐书范文
2014/02/13 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
暑期工社会实践报告
2015/07/13 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫