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 相关文章推荐
初级的用php写的采集程序
Mar 16 PHP
php 表单数据的获取代码
Mar 10 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
php短信接口代码
May 13 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PHP实现小程序批量通知推送
Nov 27 PHP
php抽象类和接口知识点整理总结
Aug 02 PHP
php5与php7的区别点总结
Oct 11 PHP
PHP如何防止用户重复提交表单
Dec 09 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下连接mssql2005的代码
2011/01/17 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
setTimeout学习小结
2017/02/08 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
大学生大二自我鉴定
2013/10/28 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
学历证明样本
2015/06/16 职场文书
公司周年庆典致辞
2015/07/30 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB