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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
人大复印资料处理程序_查询篇
Oct 09 PHP
PHP中函数内引用全局变量的方法
Oct 20 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
php分页示例分享
Apr 30 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
php实现Session存储到Redis
Nov 11 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
Centos7安装swoole扩展操作示例
Mar 26 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHP程序员编程注意事项
2008/04/10 PHP
关于页面优化和伪静态
2009/10/11 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
php数组随机排序实现方法
2015/06/13 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
javascript生成大小写字母
2015/07/03 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
python 文件与目录操作
2008/12/24 Python
python 判断自定义对象类型
2009/03/21 Python
零基础学Python(一)Python环境安装
2014/08/20 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
python flask中动态URL规则详解
2019/11/22 Python
python线程信号量semaphore使用解析
2019/11/30 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
班主任经验交流会主持词
2014/04/01 职场文书
试用期自我评价范文
2015/03/10 职场文书