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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
分享php多功能图片处理类
May 15 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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
phpwind中的数据库操作类
2007/01/02 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP简单日历实现方法
2016/07/20 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
浅析Git版本控制器使用
2017/12/10 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
python 识别图片中的文字信息方法
2018/05/10 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
Python 多维List创建的问题小结
2019/01/18 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
动物学专业毕业生求职信
2013/10/11 职场文书
员工团队活动方案
2014/08/28 职场文书
学习教师法的心得体会
2014/09/03 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python