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的FTP学习(一)[转自奥索]
Oct 09 PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
php车辆违章查询数据示例
Oct 14 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
php头像上传预览实例代码
May 02 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 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的字符串用法小结
2010/06/08 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
H5实现仿flash效果的实现代码
2017/09/29 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
python脚本设置系统时间的两种方法
2016/02/21 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
python 两种方法删除空文件夹
2020/09/29 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
社区庆八一活动方案
2014/02/02 职场文书
事业单位个人总结
2015/02/12 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
PHP策略模式写法
2021/04/01 PHP