gpt4 book ai didi

perl - 如何并行运行 perl 脚本

转载 作者:行者123 更新时间:2023-12-01 23:08:43 25 4
gpt4 key购买 nike

我如何每次都使用不同的输入参数并行运行 perl 脚本:

插图:

perl example.pl param1 param2
perl example.pl param3 param4

我想运行 perl 脚本 example.pl 2 次或多次不同输入 paramsX .每次它都应该并行运行。

示例算法如下:
my $params='1,2,3,4,5';   
my @all_params = split(/\;/, $params);
foreach my $entry (@all_param)
{
perl example.pl $entry
}

我想为每个循环并行运行 perl 脚本。

最佳答案

你问的事情看起来很简单,但实际上比看起来要复杂得多。
在 perl 中并行化并不太难,但是......这里是龙。当您的程序变得不确定时,并行代码会引入一组全新的错误和竞争条件。您无法再可靠地知道执行顺序。 (如果你假设你这样做,你会创造一个竞争条件)。
但考虑到这一点 - 真的有 3 种(ish?)方法可以解决。
fork
使用 Parallel::ForkManager并用 fork 将你的内环包起来。这对于“简单”并行非常有效,但在您的 fork 之间进行通信很困难。

#!/usr/bin/env perl

use strict;
use warnings;

use Parallel::ForkManager;

my $manager = Parallel::ForkManager->new(2); #2 concurrent

my $params = '1,2,3,4,5';
my @all_params = split( /,/, $params );

foreach my $entry (@all_param) {
$manager->start and next;
#your code to run in parallel here;
print $entry;
$manager->finish;
}
您可以使用 fork 自行推出但你可能会因为那样做而绊倒。所以 Parallel::ForkManager是工作的工具。
线:
#!/usr/bin/env perl

use strict;
use warnings;

use threads;
use Thread::Queue

my $work_q = Thread::Queue->new;

sub worker {
while ( my $item = $work_q->dequeue ) {
print $item, "\n";
}
}

my $params = '1,2,3,4,5';
my @all_params = split( /,/, $params );
$work_q->enqueue(@all_params);
$work_q->end;

threads->create( \&worker ) for 1 .. 2; #2 in parallel
foreach my $thr ( threads->list ) {
$thr->join;
}
如果您需要做更多的 IPC,这更合适 - 线程(IMO)通常对此更好。但是,您不应该将线程视为轻量级(如 fork),因为尽管您可能会从其他语言中想到 - perl 线程并不能像那样工作。
使用 IO::Select 和多个 open调用并行化:
#!/usr/bin/env perl

use strict;
use warnings;

use IO::Select;

my $params = '1,2,3,4,5';
my @all_params = split( /,/, $params );

foreach my $param ( @all_params ) {
open ( my $io, '-|', "program_name $param" );
$select -> add ( $io );
}

while ( my $fh = $select -> can_read ) {
my $line = <$fh>;
print $line;
}
您可以通过 IPC::Run2 做类似的事情打开 STDIN 和 STDERR 的文件描述符。
我是不是该?
并行代码不是 Elixir 。它的作用是减少“块”并让您消耗资源。如果您的限制资源是 CPU,并且您有 10 个 CPU,那么并行使用 10 个会加快您的速度。
...但如果您的限制资源是 IO - 网络或磁盘带宽 - 它通常无济于事,因为争用实际上会使问题变得更糟。特别是磁盘 Controller 已经非常有效地并行化、预取和缓存,因此并行访问它们的 yield 通常很小。

关于perl - 如何并行运行 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com