我需要帮助将嵌套的for循环转换为Perl中的多线程程序,例如:
for ( my $i=0; $i<100; $i++) { for ( my $j=0; $j<100; $j++ ) { for ( my $k=0; $k<100; $k++ ) { #do something .... } } }
有没有办法我可以分割第一个循环如下并行并行运行它们
#Job1: for ( my $i=0; $i < 40; $i++) { for( my $j=0; $j < 100; $j++) { for( my $k=0; $k < 100; $k++) { #do something .... } } } #Job2: for ( my $i=40; $i < 80; $i++) { for( my $j=0; $j<100; $j++) { for( my $k=0; $k<100; $k++) { #do something .... } } } #Job3 for ( my $i=80; $i < 100; $i++) { for( my $j=0; $j < 100; $j++) { for( my $k=0; $k < 100; $k++) { #do something .... } } }
如何并行运行每个程序,然后仅在所有子程序Job1,Job2和job3完成时退出主程序.
解决方法@H_301_23@
我将提供一个我以前用过的
similar answer的参考 – 他们的关键问题是 – 你的工作完全脱钩了吗?例如.没有数据需要在它们之间移动?
如果是这样,请使用Parallel::ForkManager
,它有点像这样:
use Parallel::ForkManager;
my $fork_manager = Parallel::ForkManager -> new ( 10 ); #10 in parallel
for ( my $i=0;$i<100;$i++) {
#in parallel:
$fork_manager -> start and next;
for ( my $j=0; $j < 100; $j++) {
for ( my $k=0; $k < 100; $k++) {
#do something ....
}
}
$fork_manager -> finish;
}
$fork_manager -> wait_all_children();
这将为$i的每次迭代分叉代码并并行运行 – 而ForkManager将并发性限制为10.
这个数字应该与你的并行性的限制因素大致相当 – 如果它是cpu,那么cpu的数量,但请记住,你经常受磁盘IO的限制.
做并行时的关键警告:
>你无法保证执行顺序而不会搞乱.完全有可能循环$i == 1在循环$i == 2之后完成.或之前.管他呢.
>如果你在循环之间传递信息,并行会失去效率 – 因为发送者和接收者都需要同步.如果你需要同步整个批次,那就更糟了,所以尽量避免这样做. (例如,尽可能将其保留至结束并整理结果).
>对于分叉代码来说这是双倍的 – 它们是单独的进程,所以你实际上必须尝试来回传递事物.
>由于第一点,您可以从并行代码中获得一些非常非常果味的错误.各行代码可能以任何顺序出现,因此可能会发生非常奇怪的事情.每个进程都会进行排序,但多个进程可能会交错.像open一样无害(我的$file,“>>”,$output_filename);可以绊倒你.
>分叉在叉子之间共享数据的能力非常有限.如果您需要做很多事情,请考虑使用线程.
线程是并发的替代模型,在某些情况下可能很有价值.我一般都倾向于要求通常“更好”,但在我想要进行相当多的进程间通信的地方,我倾向于更多地关注线程.
Perl daemonize with child daemons
如果是这样,请使用Parallel::ForkManager
,它有点像这样:
use Parallel::ForkManager; my $fork_manager = Parallel::ForkManager -> new ( 10 ); #10 in parallel for ( my $i=0;$i<100;$i++) { #in parallel: $fork_manager -> start and next; for ( my $j=0; $j < 100; $j++) { for ( my $k=0; $k < 100; $k++) { #do something .... } } $fork_manager -> finish; } $fork_manager -> wait_all_children();
这将为$i的每次迭代分叉代码并并行运行 – 而ForkManager将并发性限制为10.
这个数字应该与你的并行性的限制因素大致相当 – 如果它是cpu,那么cpu的数量,但请记住,你经常受磁盘IO的限制.
做并行时的关键警告:
>你无法保证执行顺序而不会搞乱.完全有可能循环$i == 1在循环$i == 2之后完成.或之前.管他呢.
>如果你在循环之间传递信息,并行会失去效率 – 因为发送者和接收者都需要同步.如果你需要同步整个批次,那就更糟了,所以尽量避免这样做. (例如,尽可能将其保留至结束并整理结果).
>对于分叉代码来说这是双倍的 – 它们是单独的进程,所以你实际上必须尝试来回传递事物.
>由于第一点,您可以从并行代码中获得一些非常非常果味的错误.各行代码可能以任何顺序出现,因此可能会发生非常奇怪的事情.每个进程都会进行排序,但多个进程可能会交错.像open一样无害(我的$file,“>>”,$output_filename);可以绊倒你.
>分叉在叉子之间共享数据的能力非常有限.如果您需要做很多事情,请考虑使用线程.
线程是并发的替代模型,在某些情况下可能很有价值.我一般都倾向于要求通常“更好”,但在我想要进行相当多的进程间通信的地方,我倾向于更多地关注线程.
Perl daemonize with child daemons