我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程。

子进程退出后,父进程没有及时回收,就会产生僵尸进程。

 
例1:
<?php

define('FORK_NUMS', 5);
$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]) {
pcntl_wait($status);
} else {
echo getmypid() , " {$i} \r\n";
exit;
}
}

我们通过for循环fork出5个子进程,父进程会阻塞着等待子进程退出,然后创建下一个子进程。

上述代码输出结果如下:
20081 0
20082 1
20083 2
20084 3
20085 4
但我们创建多进程的目的,就是为了能够并行的处理任务,阻塞的方式并不是我们想看到的。
例2:
<?php

define('FORK_NUMS', 5);

$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]) {
pcntl_wait($status, WNOHANG);
} else {
echo getmypid() , " {$i} \r\n";
exit;
}
}
我们可以通过设置pcntl_wait的第二个参数为WNOHANG来控制进程是否阻塞。
该函数可以在没有子进程退出的情况下立刻跳出执行后续代码。
 
pcntl_wait等同于以pid为-1调用pcntl_waitpid函数。
pcntl_waitpid函数可以等待指定pid的进程。
 
 
 

php多进程中的阻塞与非阻塞的更多相关文章

  1. PHP多进程学习(二)__fork起多个子进程,父进程的阻塞与非阻塞

    先简单来了解一下多进程 [来初步了解一下PHP多进程及简单demo] php的多进程是不是可以无限制的fork子进程?fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的 ...

  2. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  3. IO中同步、异步与阻塞、非阻塞的区别(转)

    转自:http://blog.chinaunix.net/uid-26000296-id-3754118.html 一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步, ...

  4. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  5. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

  6. 蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

    今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...

  7. node.js中对同步,异步,阻塞与非阻塞的理解

    我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了. javascript为什 ...

  8. Verilog中的阻塞与非阻塞

    这篇文档值得阅读 按说阻塞与非阻塞是Verilog中最基本的东西,也是老生常谈.但是最近看到很多程序里用到阻塞语句竟然不是很明白,说到底是从来没有自己仔细分析过.当然一般情况程序中也是推荐用非阻塞的. ...

  9. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  10. [转]Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

随机推荐

  1. SOAP,RESTFull以及RPC的认识

    a.一般的系统,开发都是针对数据库开发,不存在系统之间的交互,但是随着现实是有好多系统(好多DB,DB不开放),这些系统之间要进行交互,就像人一样要互相帮助.所以      可以通过一下的方式: 1. ...

  2. T1330 最少步数(#Ⅱ- 8)(广度优先搜索)

    [题目描述] 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字.他的同桌平时喜欢下围棋, ...

  3. java开发-问题清单

    本人是做Java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些 1. junit用法,before,before ...

  4. Mysql 开启Federated引擎以及使用

    FEDERATED是其中一个专门针对远程数据库的实现.但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中通过这个引擎可以实现类似Oracle 下DBLINK的远程 ...

  5. html页面中iframe导致JavaScript失效

    <body onload=“reset()”> <div id="part1"> some thing here .... <div> < ...

  6. VB6 内存释放

    VB在内存释放方面是这样的, 首先和其他任何语言一样,如果是在stack分配的空间的话,操作系统自动进行管理 比如下面的语句 dim a as string '当a 超出它的作用范围以后,就会被释放掉 ...

  7. this指针的调整

    我们先来看一段代码: #include <iostream> using namespace std; class A { public: int a; A( ) { printf(&qu ...

  8. dll is in timestamps but is not known in guidmapper… 错误

    解决方法是:在Assets下右键,Reimport All

  9. java工程中不能存在多个数据库连接jar包

    java工程中不能存在多个数据库连接jar包 比如存在mysql-java-connector.jar的,放入mssqlserver.jar就会产生冲突.只能存在一个类型的jar包.

  10. Containerpilot 配置文件示例

    { consul: "localhost:8500", logging: { level: "INFO", format: "default" ...