免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2596 | 回复: 1
打印 上一主题 下一主题

perl多进程回收不到子进程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-20 20:14 |只看该作者 |倒序浏览
最近遇到一个头疼的问题,采用fork()进行多进程处理数据,最多允许一次允许50个子进程,但发现经常会遇到回收
不到子进程的情况,导致产生了一堆僵尸进程,程序就无法往后面运行了。能不能帮我解决一下。下面是我的代码。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use POSIX ":sys_wait_h";

  5. sub mutiple_ref_content_count{
  6.         my $max_process_ref_num = 50;
  7.         my $num_proc = 0;
  8.         my $num_collect = 0;
  9.         my $collect;
  10.         my @all_pid;
  11.         my @All_ref = sort keys %ref_infor;
  12.         ## == get the child signal ==
  13.         $SIG{CHLD} = sub { $num_proc-- };
  14.         for (my $i=0;$i<=$#All_ref ;$i++) {
  15.                 my $pid = fork();
  16.                 if (!defined($pid)) {
  17.                         print "Error in fork: $!";
  18.                         exit 1;
  19.                 }
  20.                 if ($pid == 0) {
  21.                    ## == child proc ==
  22.                         my $pid = $;

  23.                         push @all_pid,$pid;
  24.                         sleep(10);
  25.                         single_ref_content_count($All_ref[$i]);
  26.                         exit 0;
  27.        
  28.                 }
  29.                 $num_proc ++;
  30.                 ## == if need to collect zombies ==
  31.                 if (($i-$num_proc-$num_collect) > 0) {
  32.                         while (($collect = waitpid(-1, WNOHANG)) > 0) {
  33.                                 $num_collect ++;
  34.                         }
  35.                 }
  36.                 while ($num_proc >=$max_process_ref_num ) {
  37.                         sleep(11);
  38.                 }
  39.         }

  40.         while ($num_proc >=1) {
  41.                 sleep(10);
  42.         }
  43. }
复制代码

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
2 [报告]
发表于 2016-04-20 21:50 |只看该作者
try this and see if it works:

1 while waitpid(-1, WNOHANG) > 0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP