【发布时间】:2025-12-01 07:25:01
【问题描述】:
我有一个哈希(%hash),其中包含节点列表和需要为各个节点执行的命令。
在此之前,我有主机列表(@alive_hosts)应该在哪个主机上执行。
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @alive_hosts = qw/10.0.0.1 10.0.0.2/;
print Dumper(\@alive_hosts);
my %hash = (
'Node1' => 'cmd1 | cmd2 | cmd3',
'Node2' => 'cmd2 | cmd3',
'Node3' => 'cmd4 | cmd1',
'Node4' => 'cmd1',
'Node5' => 'cmd2',
'Node6' => 'cmd1 | cmd2',
'Node7' => 'cmd3 | cmd4',
);
print Dumper(\%hash);
my $num_buckets = scalar @alive_hosts;
print "num_buckets:$num_buckets\n";
my $no_of_nodes = scalar keys %hash;
my $per_bucket = int( $no_of_nodes / $num_buckets );
print "per_bucket:$per_bucket\n";
my $num_extras = $no_of_nodes % $num_buckets;
print "num_extras:$num_extras\n";
我想以这样一种方式划分这个哈希(%hash),即根据活动主机的数量,哈希应该被划分。以便将其分发给每个主机。
在上面的例子中,
Host1(10.0.0.1) 应包含:
'Node1' => 'cmd1 | cmd2 | cmd3',
'Node2' => 'cmd2 | cmd3',
'Node3' => 'cmd4 | cmd1',
'Node4' => 'cmd1'
Host2(10.0.0.2) 应包含:
'Node5' => 'cmd2',
'Node6' => 'cmd1 | cmd2',
'Node7' => 'cmd3 | cmd4'
以上 2 个值可以保存在新的哈希中,从那里我需要执行一个 shell 脚本,将上述值(即节点和 cmds)作为并行参数传递。为了并行执行此操作,我想使用Parallel::Loops 或Parallel::ForkManager。任何想法/建议将不胜感激。
【问题讨论】:
标签: perl hash parallel-processing fork