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 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
一些php技巧与注意事项分析
Feb 03 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
Jan 07 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python异常学习笔记
2015/02/03 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python 以16进制打印输出的方法
2018/07/09 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
python实现飞机大战游戏
2020/10/26 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
大学生学习生活的自我评价
2013/11/01 职场文书
小班评语大全
2014/05/04 职场文书
三八妇女节寄语
2015/02/27 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Redis入门基础常用操作命令整理
2022/06/01 Redis
TypeScript 内置高级类型编程示例
2022/09/23 Javascript