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 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
PHP中数组的三种排序方法分享
May 07 PHP
解析PHP高效率写法(详解原因)
Jun 20 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
举例讲解PHP面对对象编程的多态
Aug 12 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
php中Swoole的热更新实现代码实例
Mar 04 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处理excel cvs表格的方法实例介绍
2013/05/13 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
Yii核心验证器api详解
2016/11/23 PHP
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python中Apriori算法实现讲解
2017/12/10 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python线程threading模块用法详解
2020/02/26 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
css3的transition属性详解
2014/12/15 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
探矿工程师自荐信
2014/01/24 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
实施意见格式范本
2015/06/05 职场文书
立案决定书范文
2015/06/24 职场文书
优秀大学生申请书
2019/06/24 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL