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操作Access类(PHP+ODBC+Access)
Jan 02 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php下获取http状态的实现代码
May 09 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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/08/08 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
python自定义类并使用的方法
2015/05/07 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python容器类型公共方法总结
2020/08/19 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
波兰珠宝品牌:YES
2019/08/09 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
人力资源主管岗位职责
2014/01/29 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
总经理人事任命书
2014/06/05 职场文书
综艺节目策划方案
2014/06/13 职场文书
中学推普周活动总结
2015/05/07 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
接收函
2019/04/22 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
Java基础之this关键字的使用
2021/06/30 Java/Android