如何将嵌套的for循环转换为perl中的多线程程序
我需要帮助将嵌套的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完成时退出主程序. 解决方法
我将提供一个我以前用过的
similar answer的参考 – 他们的关键问题是 – 你的工作完全脱钩了吗?例如.没有数据需要在它们之间移动?
如果是这样,请使用 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之后完成.或之前.管他呢. 线程是并发的替代模型,在某些情况下可能很有价值.我一般都倾向于要求通常“更好”,但在我想要进行相当多的进程间通信的地方,我倾向于更多地关注线程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |