码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-05-06 19:06:16      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

  关于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 }

执行结果如下:

技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/panada/p/5461466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!