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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
一个域名查询的程序
Oct 09 PHP
PHP分页显示制作详细讲解
Nov 19 PHP
php数据库密码的找回的步骤
Jan 12 PHP
php购物车实现代码
Oct 10 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
apache和PHP如何整合在一起
Oct 12 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP基于进程控制函数实现多线程
Dec 09 PHP
PHP 出现 http500 错误的解决方法
Mar 09 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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
VOLVO车载收音机
2021/03/02 无线电
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
小程序点击图片实现自动播放视频
2020/05/29 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
公司JAVA开发面试题
2015/04/02 面试题
店长岗位的工作内容
2013/11/12 职场文书
21岁生日感言
2014/02/27 职场文书
师德建设实施方案
2014/03/21 职场文书
新闻编辑求职信
2014/04/09 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
奖金申请报告模板
2015/05/15 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏
Go语言怎么使用变长参数函数
2022/07/15 Golang