加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何将嵌套的for循环转换为perl中的多线程程序

发布时间:2020-12-16 06:26:30 所属栏目:大数据 来源:网络整理
导读:我需要帮助将嵌套的for循环转换为Perl中的多线程程序,例如: for ( my $i=0; $i100; $i++) { for ( my $j=0; $j100; $j++ ) { for ( my $k=0; $k100; $k++ ) { #do something .... } } } 有没有办法我可以分割第一个循环如下并行并行运行它们 #Job1: for ( m
我需要帮助将嵌套的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的参考 – 他们的关键问题是 – 你的工作完全脱钩了吗?例如.没有数据需要在它们之间移动?

如果是这样,请使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读