2019独角兽企业重金招聘Python工程师标准>>>

本文目的

本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。

PHP多进程

通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!

管道PIPE

管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。

僵尸进程

子进程结束时,父进程没有等待它(通过调用wait或者waitpid),那么子进程结束后不会释放所有资源(浪费呀!),这种进程被称为僵尸进程,他里面存放了子进程结束时的相关数据,如果僵尸进程过多,会占用大量系统资源(如内存),影响机器性能。

代码

废话少说直接上代码

/**
  * this is a demo for php fork and pipe usage. fork use
  * to create child process and pipe is used to sychoroize
  * the child process and its main process.
  * @author bourneli
  * @date: 2012-7-6
  */
define( "PC" , 10); // 进程个数
define( "TO" , 4); // 超时
define( "TS" , 4); // 事件跨度,用于模拟任务延时
if  (!function_exists( 'pcntl_fork' )) {
     die ( "pcntl_fork not existing" );
}
// 创建管道
$sPipePath  = "my_pipe." .posix_getpid();
if  (!posix_mkfifo( $sPipePath , 0666)) {
     die ( "create pipe {$sPipePath} error" );
}
// 模拟任务并发
for  ( $i  = 0; $i  < PC; ++ $i  ) {
     $nPID  = pcntl_fork(); // 创建子进程
     if  ( $nPID  == 0) {
         // 子进程过程
         sleep(rand(1,TS)); // 模拟延时
         $oW  = fopen ( $sPipePath , 'w' );
         fwrite( $oW , $i . "\n" ); // 当前任务处理完比,在管道中写入数据
         fclose( $oW );
         exit (0); // 执行完后退出
     }
}
// 父进程
$oR  = fopen ( $sPipePath , 'r' );
stream_set_blocking( $oR , FALSE); // 将管道设置为非堵塞,用于适应超时机制
$sData  = '' ; // 存放管道中的数据
$nLine  = 0;
$nStart  = time();
while  ( $nLine  < PC && (time() - $nStart ) < TO) {
     $sLine  = fread ( $oR , 1024);
     if  ( empty ( $sLine )) {
         continue ;  
     }  
     
     echo  "current line: {$sLine}\n" ;
     // 用于分析多少任务处理完毕,通过‘\n’标识
     foreach ( str_split ( $sLine ) as  $c ) {
         if  ( "\n"  == $c ) {
             ++ $nLine ;
         }
     }
     $sData  .= $sLine ;
}
echo  "Final line count:$nLine\n" ;
fclose( $oR );
unlink( $sPipePath ); // 删除管道,已经没有作用了
// 等待子进程执行完毕,避免僵尸进程
$n  = 0;
while  ( $n  < PC) {
     $nStatus  = -1;
     $nPID  = pcntl_wait( $nStatus , WNOHANG);
     if  ( $nPID  > 0) {
         echo  "{$nPID} exit\n" ;
         ++ $n ;
     }
}
// 验证结果,主要查看结果中是否每个任务都完成了
$arr2  = array ();
foreach ( explode ( "\n" , $sData ) as  $i ) { // trim all
     if  ( is_numeric (trim( $i ))) {
         array_push ( $arr2 , $i ); 
     }
}
$arr2  = array_unique ( $arr2 );
if  ( count ( $arr2 ) == PC) { 
     echo  'ok' ;
} else  {
     echo   "error count "  . count ( $arr2 ) . "\n" ;
     var_dump( $arr2 );
}

ok,完毕,注释写的比较清除,执行结果如下:

转载于:https://my.oschina.net/u/247923/blog/282663

PHP多进程处理并行处理任务实例相关推荐

  1. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU ...

  2. LINUX 多进程编程 C语言实例

    LINUX多进程编程 简单实例 1.ps与top命令 查看进程状态 2.系统调用ping,并执行 #include <stdio.h> #include <string.h> ...

  3. python多进程编程实例_Python多进程编程multiprocessing代码实例

    下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 import multiprocessing import time def get_html(n): time.slee ...

  4. Nodejs【单机】多进程模式集群

    Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...

  5. php多进程有什么用,有关php多进程的用法举例

    在php中实现多进程,一般有两种方法,一种是使用PHP自带的pcntl_*函数(仅限linux),另一种就是使用popen/proc_open,然后在php内部控制进程数量. 使用pcntl_*函数 ...

  6. Linux多进程编程(2)

    简介 IPC(Inter Process Communication,进程间通信)的方式总共有三种,分别是信号量.共享内存和消息队列,本文介绍前两种. 在Linux中,进程之间操作公共数据时,需要进行 ...

  7. 什么?Python的多进程居然比单进程慢?

    导读 很多时候,当我们需要使用Python来处理大量的数据的时候,为了缩短处理的时间,我们会使用多线程或多进程来并行处理任务. 由于Python全局解释器锁的存在,导致在执行多线程的时候实际上只有一个 ...

  8. PHP多进程协作编程之-popen

    使用popen结合SHELL命令也可以实现多进程并发编程. 实例如下: <?php //b.php文件 $file = 'testdir/file.txt'; for ($i=0;$i<1 ...

  9. Python——多线程与多进程

    Python--多线程与多进程 学习python进阶能力,多进程与多线程的能力是必须的,不然真out了.以下内容部分摘自博客:Python 多线程与多进程.Python:多线程及多进程的使用. 一.线 ...

最新文章

  1. asp.net mvc 学习
  2. LeetCode House Robber III(动态规划)
  3. .Net Core中使用Quartz.Net Vue开即用的UI管理
  4. 2021.08.25学习内容torch.clamp(input, min, max, out=None) → Tensor,torch.mm(matrix multiply)
  5. 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
  6. linux虚拟机中安装java软件,在 Linux 中安装 JAVA 虚拟机
  7. 医药电商为何发展不起来?
  8. python编程怎么命名_命名规范-python编程入门系列图文教程 - Python学习网
  9. ILSpy反编译工具的使用
  10. java调用数据库存储过程的接口是_JAVA调用数据库存储过程
  11. FPGA芯片手册阅读技巧
  12. java 小票打印机和触发开钱箱操作
  13. 单片机原理及应用 张鑫_单片机原理及应用
  14. 双拼输入法软件测试,为什么推荐你使用双拼输入法?
  15. WOW 最简单的插件入门,适合不知道怎么创建XML/自己写的插件始终不生效的
  16. 这些带斑点的蛇实在太漂亮了,盘点18种带斑点的蛇
  17. 用HTML+CSS做一个简单好看的环保网页
  18. [MySQL]初始JDBC编程
  19. NB模块-QS100-默认demo
  20. 残躯演绎完美爱情 浙江“轮椅夫妻”温暖千万网友

热门文章

  1. 谈谈对MVC的理解(View+Model+Controller)
  2. 深圳市收运体系运营管理_华为公司质量管理体系构建和运营实践
  3. python getattr函数_Python中的getattr()函数详解
  4. oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动
  5. mysql2012更改表名_T-SQL入門攻略之13-修改数据表
  6. 市面上有哪几种门_选择 low-e门窗玻璃,你想知道的都在这了
  7. imeoptions android,软键盘小记Android:imeOptions
  8. retrofit 2.0 android 教程,初识Retrofit2.0
  9. 怎样用mysql查询测试_如何测试数据库查询优化器
  10. 商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介