关于perl的多进程,大家可能马上会想到Parallel::ForkManager这个模块。但是今天我们试着自己动手写一个类似的框架:)

  该多进程开发模型从开源服务器框架Lighttpd发展而来,核心思路是父进程监控子进程的状态并负责回收,子进程负责任务的执行。当前预先可以设置子进程并发数目的上限值。如需要涉及到进程间的通信,可以通过建立管道pipe的方式,让子进程在结束前将数据通过共享管道写入,待父进程适时读取即可。

   本人在工作中进程遇到这样的场景,如从DB取若干任务,收包等等(不停的取/收),为了保证效率,一般都采取并发执行;使用脚本主要为了轻量级,易部署。这种场景下很适合用这种watcher-worker模式。perl代码如下:

  

 #!/usr/bin/perl -w

 #author:pandaychen
#date:2015-04-01
#info:实现一个简单的多进程框架 use strict;
use warnings;
use POSIX ":sys_wait_h"; my $max_process = ;
my $cur_process =; my @pid_array; print "perl fork watcher-worker:\n"; #main start here
CreateWorker($max_process); #child start here
do_workers(); sub CreateWorker{
my $workers=shift(@_);
print $workers,"\n"; my $sign = ; while($sign){
if($workers >){
my $pid = fork();
if($pid >){
#watcher
$sign = ;
--$workers;
}
elsif($pid == ){
#workers
$sign = ;
print "create worker ",$$," success!\n" ;
do_workers();
}
else
{
print "fork error: %s\n";
return -;
}
}
else{
#full workers
my $nStatus;
while ((my $collect = waitpid(-, WNOHANG)) > )
{
print $collect," child process\n";
$workers++;
}
}
}
return ;
} sub do_workers{
#模拟子进程工作
my $rand=int(rand());
sleep($rand);
print "child process sleep ",$rand," seconds.\n";
exit();
}

执行结果如下:

Perl的多进程框架(watcher-worker)的更多相关文章

  1. Tachyon框架的Worker心跳及Master高可用性分析

    0 概述 分布式框架中的Master-Slave类型,Slave节点负责工作的具体执行,Master负责任务的分发或者相关元数据的存储等.一般情况下,一个Master节点都会对应多个Slave节点,M ...

  2. 前端框架小实验-在umi框架中以worker线程方式使用SQL.js的wasm

    总述:在Win7环境下配置umijs框架,在框架中用worker线程方式使用SQL.js的wasm,在浏览器端实现数据的增删改查以及数据库导出导入. 一.安装node.js 1.Win7系统只支持no ...

  3. 分布式计算框架Gearman原理详解

    什么是Gearman? Gearman提供了一个通用的应用程序框架,用于将工作转移到更适合于工作的其他机器或流程.它允许你并行工作,负载平衡处理,并在语言间调用函数.它可用于从高可用性网站到传输数据库 ...

  4. php我们需要把握面试题目金鸡基础

    1.session与cookie差分? 答:session:储存用户訪问的全局唯一变量,存储在server上的php指定的文件夹中的(session_dir)的位置进行的存放 cookie:用来存储连 ...

  5. PHP 和 Java 的主要区别有哪些?

    PHP 和 Java 的主要区别有哪些? 其实Java方面我要学的真的还有很多,要是有大项目的机会和经验就好,所以提前我肯定要把基础打扎实. 我要学的还有很多,比如前段,后端,还有linux,还有肯定 ...

  6. gearman(异步计算)学习

    Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务 ...

  7. Mysql 和 Postgresql(PGSQL) 对比

    Mysql 和 Postgresql(PGSQL) 对比 转载自:http://www.oschina.net/question/96003_13994 PostgreSQL与MySQL比较 MySQ ...

  8. 聊天室(上篇)GatewayWorker 基础

    前言 本文的目的是基于 GatewayWorker 官方手册,梳理一次 GatewayWorker,并在实践中与 MVC 框架整合的思路(附最终的项目源码).如果你已经理解了整合这一块儿的知识,那么就 ...

  9. php与java

    作者:eechen链接:https://www.zhihu.com/question/20377398/answer/141328982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

随机推荐

  1. 如何去掉Eclipse里面自动追加的一些注释!!!内详

    比如我创建一个类,勾选了自动生成main函数.他就来一个// TODO Auto-generated method stub比如我输入"try"然后自动补完try catch bl ...

  2. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  3. flask-admin章节三:数据库迁移工具 alembic初步使用

    1. 概述 基于flask框架构建web,一般会使用sqlchemy(在flask中使用sqlchemy可以参考这里)作为数据库引擎. 这样业务的逻辑就可以做到不跟具体的数据库类型相耦合,具体后端业务 ...

  4. Spring Boot + Bootstrap 出现"Failed to decode downloaded font"和"OTS parsing error: Failed to convert WOFF 2.0 font to SFNT"

    准确来讲,应该是maven项目使用Bootstrap时,出现 "Failed to decode downloaded font"和"OTS parsing error: ...

  5. Web API - Video File Streaming

    关于C# WEBAPI 视频文件 http://www.codeproject.com/Articles/820146/HTTP-Partial-Content-In-ASP-NET-Web-API- ...

  6. svn没有对号等符号的问题

    文件夹--右键->TortoiseSVN->Settings  => 弹出一个对话框,在对话框中左边框中有一个Icon Overlays->Overlay Handlers   ...

  7. vertx简单服务创建

    import java.util.HashMap;import java.util.Map; import org.slf4j.Logger;import org.slf4j.LoggerFactor ...

  8. HttpWebRequest类

    HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...

  9. java-base64编码和解码

    一.反射/*** * encode by Base64 */ public static String encodeBase64(byte[]input) throws Exception{ Clas ...

  10. js基础知识点总结

    如何在一个网站或者一个页面,去书写你的js代码:1.js的分层(功能):jquery(tool) 组件(ui) 应用(app),mvc(backboneJs)2.js的规划():避免全局变量和方法(命 ...