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 Ajax实现页面无刷新发表评论
Jan 02 PHP
php使用反射插入对象示例分享
Mar 11 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP date函数常用时间处理方法
May 11 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
Laravel下生成验证码的类
Nov 15 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
Aug 12 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 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&amp;java(一)
2006/10/09 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
JQuery基础语法小结
2015/02/27 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python读取properties配置文件操作示例
2018/03/29 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
如何获取Python简单for循环索引
2019/11/21 Python
Pytorch中.new()的作用详解
2020/02/18 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
python如何实现DES加密
2020/09/21 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
即兴演讲稿
2014/01/04 职场文书
汽车装潢店创业计划书范文
2014/02/05 职场文书
小区文明倡议书
2014/05/16 职场文书
本科生就业推荐信
2014/05/19 职场文书
三孔导游词
2015/02/05 职场文书
Python中文纠错的简单实现
2021/07/07 Python