php多进程中的阻塞与非阻塞操作实例分析


Posted in PHP onMarch 04, 2020

本文实例讲述了php多进程中的阻塞与非阻塞操作。分享给大家供大家参考,具体如下:

我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程。

子进程退出后,父进程没有及时回收,就会产生僵尸进程。

例1:

<?php
define('FORK_NUMS', 5);
$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]) {
    pcntl_wait($status);
  } else {
    echo getmypid() , " {$i} \r\n";
    exit;
  }
}

我们通过for循环fork出5个子进程,父进程会阻塞着等待子进程退出,然后创建下一个子进程。

上述代码输出结果如下:

20081 0
20082 1
20083 2
20084 3
20085 4

但我们创建多进程的目的,就是为了能够并行的处理任务,阻塞的方式并不是我们想看到的。

例2:

<?php
define('FORK_NUMS', 5);
 
$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]) {
    pcntl_wait($status, WNOHANG);
  } else {
    echo getmypid() , " {$i} \r\n";
    exit;
  }
}

我们可以通过设置pcntl_wait的第二个参数为WNOHANG来控制进程是否阻塞。

该函数可以在没有子进程退出的情况下立刻跳出执行后续代码。

  • pcntl_wait等同于以pid为-1调用pcntl_waitpid函数。
  • pcntl_waitpid函数可以等待指定pid的进程。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
source.php查看源文件
Dec 09 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
php使用百度翻译api示例分享
Jan 31 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
php 中的信号处理操作实例详解
Mar 04 #PHP
php libevent 功能与使用方法详解
Mar 04 #PHP
php+iframe 实现上传文件功能示例
Mar 04 #PHP
php实现文件上传基本验证
Mar 04 #PHP
PHP实现文件上传操作和封装
Mar 04 #PHP
PHP实现文件上传后台处理脚本
Mar 04 #PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 #PHP
You might like
php和javascript之间变量的传递实现代码
2012/12/19 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
中软国际Java程序员机试题
2012/08/19 面试题
青春演讲稿范文
2014/05/08 职场文书
安全口号大全
2014/06/21 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
人民检察院起诉书
2015/05/20 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
vue backtop组件的实现完整代码
2021/04/07 Vue.js