首页 > 解决方案 > 如何在 Perl 中分叉 30 个连接

问题描述

我正在编写一个监视脚本来登录数据库、执行任务和注销。我有 30 个数据库帐户。但是我希望我的 Perl 脚本能够通过 30 个同时登录来执行此任务,并且目前我的循环有一个迭代必须在另一个迭代开始之前完成。

 #!/usr/bin/perl
 use strict;

 foreach my $i ( "01" .. "30" ) {
 do stuff...
 }

标签: perl

解决方案


简单的方法,取决于你的脚本可能需要做的其他事情,就是自己分叉 30 次,每个副本处理一个帐户。

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/:sys_wait.h/;

my $nchildren = 0;
$SIG{"CHLD"} = sub { while (waitpid(-1, WNOHANG) > 0) { $nchildren -= 1; } };

for my $i ( "01" .. "30" ) {
  my $pid = fork;
  if (! defined $pid) {
    die "Unable to fork: $!\n";
  } elsif ($pid == 0) {
     # Do stuff for account $i
     exit 0; # And exit.
  } else {
    $nchildren += 1;
  }
}

# Wait for all child processes to exit.
while ($nchildren > 0) {
  sleep 1;
}

推荐阅读