PHP多进程处理并行处理任务实例

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

本文目的

本文通过例子讲解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,完毕,注释写的比较清除,执行结果如下:

clip_image002


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python PyCharm利用PyQt5使QPlainTextEdit支持拖放文件,类提升,重写QPlainTextEdit类

一、利用PyCharm新建基于PyQt5对话框工程MyMainTest,添加QPlainTextEdit控件,保存主窗口MyQTMainForm.ui文件运行如下: 二、新建myqplaintextedit.py文件,创建MyQPlainTextEdit类继承于QPlainTextEdit,只允许excel(.xls或.xlsx)文件拖放,及信号发射处理。代码如下: #…

经典面试题|ConcurrentHashMap 读操作为什么不需要加锁?

作者 | 上帝爱吃苹果来源 | cnblogs.com/keeya/p/9632958.html我们知道&#xff0c;ConcurrentHashmap(1.8)这个并发集合框架是线程安全的&#xff0c;当你看到源码的get操作时&#xff0c;会发现get操作全程是没有加任何锁的&#xff0c;这也是这篇博文讨论的问题——为什么它…

正能量

2019独角兽企业重金招聘Python工程师标准>>> 对别人&#xff0c;永远把最好的方面表现出来&#xff0c;这样别人都会为你传递正能量&#xff0c;你就能够得到能量累加。 对自己&#xff0c;要自信&#xff0c;永远给自己传递正能量&#xff0c;这样自己周边的能量场…

Python datetime time计算时间差

一、计算时间差 """ python主文件 """ # -*- coding: utf-8 -*-import time"""主函数 """ if __name__ __main__:# 获取当前开始的日期和时间&#xff0c;例&#xff1a;2022-02-05 14:20:36strStartDateTime …

面试官 | AJAX请求为什么不安全?

作者 | 撒网要见鱼链接 | cnblogs.com/dailc/p/8191150.html# AJAX三问AJAX请求真的不安全么&#xff1f;AJAX请求哪里不安全&#xff1f;怎么样让AJAX请求更安全&#xff1f;# 前言本文包含的内容较多&#xff0c;包括AJAX&#xff0c;CORS&#xff0c;XSS&#xff0c;CSRF等内…

IE6,IE7 Firefox 兼容问题

2019独角兽企业重金招聘Python工程师标准>>> 关于ie6、ie7和ff浏览器兼容网友评论 0 条 转载到博客 2009-1-8 16:11:23 来源: 本站整理顶一下这些方法都是我平时用到时在网上找到收藏下来的呵呵&#xff0c;我提前声明一下免得误会!一、CSS HACK以下两种方法几乎能…

PyCharm PyQt5创建主窗口源代码

一、PyCharm PyQt5创建主窗口基本过程: 1.打开PyCharm,新建工程MyMainTest。 2.按照Tools-External Tools-QtDesigner,打开QT设计界面,创建主窗口界面,以名称MyQTMainForm.ui保存窗体文件。 3.将MyQTMainForm.ui窗体文件生成MyQTMainForm.py文件。 4.新建main.py文件,…

面试官 | 说一下什么是代理模式?

看了这篇文章&#xff0c;你会对静态代理模式&#xff0c;JDK 动态代理模式和 CGLIB 动态代理模式有个很清晰的认识。01、简介什么是代理模式代理模式也称为委托模式&#xff0c;属于结构型模式之一。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#x…

如何设制 select 不可编辑 只读

1. <select style"width:195px" name"role" id"role" οnfοcus"this.defaultIndexthis.selectedIndex;" οnchange"this.selectedIndexthis.defaultIndex;">这种方法可以使下拉框和平常没有区别&#xff0c;看起来没…

面试官 | 说一下 JVM 常用参数有哪些?

作者 | SimpleSmile_5177来源 | i7q.cn/50SRVt前言说一下 JVM 常用的参数有哪些&#xff1f;是比较常用的面试问题&#xff0c;同时如果项目特别大了&#xff0c;需要增加一下堆内存的大小、或者是系统老是莫明的挂掉&#xff0c;想查看下gc日志来排查一下错误的原因&#xff…

CSS 实现按钮及线呼吸灯效果

1. [代码]style view sourceprint?01<style>02 body{03 font-family:Segoe UI Light,Segoe UI,Arial,微软雅黑,sans-serif;04 font-size: 20px;05 color:#333333;0607 }08 .breath {…

Python设置网卡自己封装的Internet类 WMI

简介: 下面是自己用Python做项目过程中,自己封装的Internet类,可以设置本机IP地址、默认网关、子网掩码和DNS,也可以获取本机IP地址、默认网关、子网掩码、DNS和本机MAC信息。 myPyDoInternet.py """=== coding: UTF8 ===""" import uuidi…

美团面试题 | JVM 堆内存溢出后,其他线程是否可继续工作?

作者&#xff1a;gosaintmrc来源&#xff1a;http://sina.lt/gqaM最近网上出现一个美团面试题&#xff1a;“一个线程OOM后&#xff0c;其他线程还能运行吗&#xff1f;”我看网上出现了很多不靠谱的答案。这道题其实很有难度&#xff0c;涉及的知识点有jvm内存分配、作用域、g…

Java面向对象设计原则

面向对象设计原则是OOPS&#xff08;Object-Oriented Programming System,面向对象的程序设计系统&#xff09;编程的核心&#xff0c;但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式&#xff0c;而不重视面向对象的分析和设计。甚至还有经验丰富的Jav…

Python格式化字符串f-string常用用法

简介&#xff1a; f-string&#xff0c;亦称为格式化字符串常量&#xff08;formatted string literals&#xff09;&#xff0c;是Python3.6新引入的一种字符串格式化方法&#xff0c;该方法源于PEP 498 – Literal String Interpolation&#xff0c;主要目的是使格式化字符串…

面试官 | Java 对象不使用时为什么要赋值为 null?

作者 | zhantong来源 | www.polarxiong.com前言许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话&#xff0c;而且好多开发者一直信奉着这句话&#xff1b;问其原因&#xff0c;大都是回答“有利于GC更早回收内存&#xff0c;减少内存占用”&#xff0c;但再往…

CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

一、简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端。它提供了对日志的简单浏览、搜索、基本分析和一些图表报告的功能。数据可以从数据库或一般的syslog文本文件中获取&#xff0c;所以LogAnalyzer不需要改变现有的记录架构。基于当前的日志数据&#xff0c;它…

PyQt5 Python主对话框创建关于对话框源代码

PyQT5 Python主对话框菜单“帮助”下的“关于”按钮,创建关于对话框,如下: main.py源代码 """ python主文件 """ # -*- coding: utf-8 -*- import os import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, Q…

国内各大厂 | 简历投递信息汇总和精美模板下载

作者 | 王磊来源 | Java中文社群1 前言为了让你的简历能被各大厂商的 HR 第一时间看到&#xff0c;我人工整理了以下投递渠道方便你能直接投递&#xff0c;下面一起来看&#xff08;排名不分先后&#xff09;。2 投递信息汇总阿里巴巴https://campus.alibaba.com/index.htm腾讯…

关于UIView的userInteractionEnabled属性

如果父视图为ParentView包含一个Button&#xff0c;如果再ParentView上添加子视图ChildView&#xff0c;且ChildView盖住了 Button&#xff0c;那么Button就得到不响应了&#xff0c;为了让Button响应&#xff0c;可以设置ChildView的userInteractionEnabled &#xff1d; NO&a…