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 三维饼图的实现代码
Sep 28 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php 字符串函数收集
Mar 29 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
php简单smarty入门程序实例
Jun 11 PHP
PHP register_shutdown_function()函数的使用示例
Jun 23 PHP
php搜索文件程序分享
Oct 30 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
php文件上传类完整实例
May 14 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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数学运算
2011/12/30 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
php实现网站留言板功能
2015/11/04 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python线程指南详细介绍
2017/01/05 Python
Python学习思维导图(必看篇)
2017/06/26 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Django后台admin的使用详解
2019/07/08 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
英文版销售经理个人求职信
2013/11/20 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
电子商务求职信
2014/06/15 职场文书
工作会议通知
2015/04/15 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
西游降魔篇观后感
2015/06/15 职场文书