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面向对象分析设计的61条军规小结
Jul 17 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
PHP动态输出JavaScript代码实例
Feb 12 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
windows7配置Nginx+php+mysql的详细教程
Sep 04 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 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
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
10个简化PHP开发的工具
2014/12/25 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
JS的数组迭代方法
2015/02/05 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
python通过文件头判断文件类型
2015/10/30 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
英国探险旅游专家:Explore
2018/12/20 全球购物
电厂职工自我鉴定
2014/02/20 职场文书
学习方法演讲稿
2014/05/10 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
分析并发编程之LongAdder原理
2021/06/29 Java/Android
mysql全面解析json/数组
2022/07/07 MySQL