Perl的多进程框架(watcher-worker)
关于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)的更多相关文章
- Tachyon框架的Worker心跳及Master高可用性分析
0 概述 分布式框架中的Master-Slave类型,Slave节点负责工作的具体执行,Master负责任务的分发或者相关元数据的存储等.一般情况下,一个Master节点都会对应多个Slave节点,M ...
- 前端框架小实验-在umi框架中以worker线程方式使用SQL.js的wasm
总述:在Win7环境下配置umijs框架,在框架中用worker线程方式使用SQL.js的wasm,在浏览器端实现数据的增删改查以及数据库导出导入. 一.安装node.js 1.Win7系统只支持no ...
- 分布式计算框架Gearman原理详解
什么是Gearman? Gearman提供了一个通用的应用程序框架,用于将工作转移到更适合于工作的其他机器或流程.它允许你并行工作,负载平衡处理,并在语言间调用函数.它可用于从高可用性网站到传输数据库 ...
- php我们需要把握面试题目金鸡基础
1.session与cookie差分? 答:session:储存用户訪问的全局唯一变量,存储在server上的php指定的文件夹中的(session_dir)的位置进行的存放 cookie:用来存储连 ...
- PHP 和 Java 的主要区别有哪些?
PHP 和 Java 的主要区别有哪些? 其实Java方面我要学的真的还有很多,要是有大项目的机会和经验就好,所以提前我肯定要把基础打扎实. 我要学的还有很多,比如前段,后端,还有linux,还有肯定 ...
- gearman(异步计算)学习
Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务 ...
- Mysql 和 Postgresql(PGSQL) 对比
Mysql 和 Postgresql(PGSQL) 对比 转载自:http://www.oschina.net/question/96003_13994 PostgreSQL与MySQL比较 MySQ ...
- 聊天室(上篇)GatewayWorker 基础
前言 本文的目的是基于 GatewayWorker 官方手册,梳理一次 GatewayWorker,并在实践中与 MVC 框架整合的思路(附最终的项目源码).如果你已经理解了整合这一块儿的知识,那么就 ...
- php与java
作者:eechen链接:https://www.zhihu.com/question/20377398/answer/141328982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
随机推荐
- Sublime Text3 (转) 配置 以及快捷键配置
一.介绍 Sublime Text 是一款较新的编辑器,它轻量.简洁.高效,良好的扩展性以及跨平台等特性,使得越来越多的开发人员喜爱.它是一款收费的商业软件,但可以免费无限制无限期的试用,只会偶尔提醒 ...
- 怎么将oracle数据库的数据迁移
打开要导出数据的PC,进入cmd界面 先进入数据库输入sqlplus,账号system密码508956.有权限的账户密码 2. create directory dir_555 as 'd:/asd1 ...
- Java多线程基本概念
基本概念 线程与任务的概念不一样. 任务:通常是一些抽象的且离散的工作单元,比如在Web请求中,针对用户的请求需要返回相应的页面是一个任务,在Java中实现Runnable接口的类也是一个任务. 线程 ...
- Python 第五天 递归,计算器(2)
利用函数编写如下数列: 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584, ...
- TCP/IP入门(3) --传输层
原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主 ...
- S2SH简介
struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts 2 Acti ...
- SQLServer数据库中创建临时表
IF object_id('tempdb..#jimmy') is not NULL BEGIN DROP TABLE #jimmy; END IF object_id('tempdb..#jimmy ...
- 亲测——pycharm下运行第一个scrapy项目 ©seven_clear
最近在学习scrapy,就想着用pycharm调试,但不知道怎么弄,从网上搜了很多方法,这里总结一个我试成功了的. 首先当然是安装scrapy,安装教程什么的网上一大堆,这里推荐一个详细的:http: ...
- centOS升级python3.5
CentOS自带的版本是2.7.5 目前在看廖老师的教学,他给的新版本是3以上了,果断升级到最新的Python版本 (windows下面多线程里面有点问题没解决,所以才换到linux下继续学习) 一 ...
- 一个日期的下一个星期五 next_date
select next_day('18-5月-2001','星期五') nxt_day from dual;