gpt4 book ai didi

Perl:异步执行10个系统进程

转载 作者:行者123 更新时间:2023-12-02 05:29:42 24 4
gpt4 key购买 nike

这道题是关于在 windows 2012 server 上运行 perl 的。

所以我有一个名为 Commands_To_Run 的文件夹,下面有 100 个批处理文件,例如

Commands_To_Run
- run_1.bat
- run_2.bat
- run_3.bat
...
- run_100.bat

这些 run*.bat 文件中的每一个都需要大约 30 分钟才能完成。如果我使用 FOR 循环连续运行这些批处理文件,则需要 100 * 30 分钟才能运行。 (太长了!)

我想要的是编写一个 perl 脚本,一次执行 10 个批处理文件。一旦任何一个批处理文件完成,就会执行下一个批处理文件。

例如我想执行 run1.bat 到 run10.bat。假设 run7.bat 完成,然后我想运行下一个 run11.bat 等等。所以在任何给定时间都有 10 个文件在运行。

我想过使用这个 perl 脚本来运行批处理文件,但这会同时运行所有 100 个,它会杀死我的 Windows CPU 和处理。

for ($x=0; $x < scalar(@files); $x++ ) {
$file=@files[$x];
chomp $file;
$cmd="start $file ";
print "Runnung Command is: $cmd\n";
system($cmd);
}

我查看了给出的建议,但没有关于如何使用 Forks::Super 的工作示例

最佳答案

在队列中并行运行进程的一种简单方法是使用 Parallel::ForkManager

use warnings;
use strict;
use feature 'say';

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(10);

# Prepare the list of your batch files (better get names from disk)
my @batch_files = map { "Commands_To_Run/run_$_.bat" } 1..100;

foreach my $batch_file (@batch_files)
{
$pm->start and next;
# Run batch job
say "Running: $batch_file";
#system($batch_file); # uncomment to actually run the jobs
$pm->finish;
}
$pm->wait_all_children;

这是一个最小但有效的脚本。参见,例如,this postthis post了解有关作业如何进行的更多信息,尤其是有关如何从作业返回数据的信息。

注意:这不是核心模块,因此您可能需要安装它

关于Perl:异步执行10个系统进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54756117/

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