Perl的多进程框架(watcher-worker)

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

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

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

  

 1 #!/usr/bin/perl -w
 2
 3 #author:pandaychen
 4 #date:2015-04-01
 5 #info:实现一个简单的多进程框架
 6
 7 use strict;
 8 use warnings;
 9 use POSIX ":sys_wait_h";
10
11 my $max_process = 20;
12 my $cur_process =0;
13
14 my @pid_array;
15
16 print "perl fork watcher-worker:\n";
17
18 #main start here
19 CreateWorker($max_process);
20
21 #child start here
22 do_workers();
23
24 sub CreateWorker{
25     my $workers=shift(@_);
26     print $workers,"\n";
27
28         my $sign = 1;
29
30         while($sign){
31             if($workers >0){
32                 my $pid = fork();
33                 if($pid >0){
34                     #watcher
35                     $sign = 1;
36                     --$workers;
37                 }
38                 elsif($pid == 0){
39                     #workers
40                     $sign = 0;
41                     print "create worker ",$$," success!\n" ;
42                     do_workers();
43                 }
44                 else
45                 {
46                     print "fork error: %s\n";
47                     return -1;
48                 }
49             }
50             else{
51                 #full workers
52                 my $nStatus;
53                 while ((my $collect = waitpid(-1, WNOHANG)) > 0)
54                 {
55                     print $collect," child process\n";
56                     $workers++;
57                 }
58             }
59         }
60     return 0;
61 }
62
63 sub do_workers{
64     #模拟子进程工作
65     my $rand=int(rand(10));
66     sleep($rand);
67     print "child process sleep ",$rand," seconds.\n";
68     exit(1);
69 }

执行结果如下:

时间: 2024-12-08 02:06:04

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

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

0 概述 分布式框架中的Master-Slave类型,Slave节点负责工作的具体执行,Master负责任务的分发或者相关元数据的存储等.一般情况下,一个Master节点都会对应多个Slave节点,Master在分配任务时需要知道当前有哪些Slave节点是可以接受自己所发的命令的(Slave节点有可能因为各种原因挂掉),因此需要在其内部维持一个链表来保存所有还活着的Slave节点.HBase的HMaster是这样.HDFS的NameNode是这样.Tachyon的Master节点也是这样.Sla

python并行处理任务时 该用多进程?还是该用多线程?

在python并行处理任务时要使用多线程还是多进程? 说到这个话题,必须要提的GIL( Global Interpreter Lock)全局解释锁,当Cpython每次执行字节码时都要先申请这个锁.那么问题就来了,如果使用多线程是比也会受到影响. 多线程和多进程程序比较,哪个性能更高?还是拿一个实例运行来看看吧- #写一个简单的例子,计算100W个随机数的和8次,同时将分散到8个线程进行运算. #thread.py #!/usr/bin/env python import random impo

Apache 两种工作模式 :prefork 、 worker

前言 1·最近这几篇文章都在讲Apache的一些安全与优化,这些针对服务器都是很重要的,掌握这些不仅提升了服务器的安全,还让服务器的性能大大的提高.这样就可以让客户有很好的体验感.2·今天这篇文章依旧是讲Apache.但是,是讲Apache的优化深入.Apache 的默认配置保证基本运行服务,但是在实际生产环境中,有时候需要把服务器性能发挥到最大化. Apache的两种工作模式:(prefork.worker) 很多朋友都知道Apache是当下Web服务器用得最广泛也是最稳定的开源软件之一,其中

计算机科学精彩帖子收集

inux源码 LXR 源自"the Linux Cross Referencer",中间的"X"形象地代表了"Cross".与 Source Navigator 类似,它也是分析阅读源代码的好工具.不同的是,它将源代码借助浏览器展示出来,文件间的跳转过程成了我熟悉的点击超链接动作. http://lxr.linux.no/   LXR安装过程简介 linux手册 http://linux.die.net/man/ Linux每周新闻 http:/

gearman(异步计算)学习

Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. 2Gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以是C.PHP.Java.Perl.Mysql ud

gearman知识文章

一篇文章: Gearman介绍.调研.测试与原理分析 gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以

flask如何处理并发

1.使用自身服务器的多进程或者多线程,参考werkzeug的run_simple函数的入参.注意,进程和线程不能同时开启 2.使用gunicorn使用多进程,-w worker 进程数,类型于运行多个app.run()开发服务器 gunicorn app -w 2 -b :8000 3.使用gevent异步 /usr/local/bin/gunicorn -t120 -w10  -b 10.57.17.57:3000 --worker-class gevent  Erebus:APP -k ST

Gearman介绍、原理分析、实践改进

gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务job Server)C++,各个API实现有各种语言的版本.PHP的Client API与Worker API实现为C扩展,在PHP官方网站有此扩展的中英文文档. gearman架构中的三个角色 client:请求的发起者,工作任务的需求方(可以是C.PHP.Java.Perl.Mysql udf等

Nginx为什么能快到根本停不下来?

Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名.本文从底层原理分析 Nginx 为什么这么快! Nginx 的进程模型 Nginx 服务器,正常运行过程中: 多进程:一个 Master 进程.多个 Worker 进程. Master 进程:管理 Worker 进程.对外接口:接收外部的操作(信号):对内转发:根据外部的操作的不同,通过信号管理 Worker:监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程. Worke