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读取msn上的用户信息类
Dec 05 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
PHP实现文件上传下载实例
Oct 18 PHP
PHP自动补全表单的两种方法
Mar 06 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
php回调函数处理数组操作示例
Apr 13 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
php输出表格的实现代码(修正版)
2010/12/29 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
python数据封装json格式数据
2018/03/04 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
实习生单位鉴定意见
2013/12/04 职场文书
投标人廉洁自律承诺书
2014/05/26 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang