使代码的某些部分与主代码并行工作

时间:2014-10-06 16:19:57

标签: multithreading perl multiprocessing

我如何创建一个将在while循环中运行的函数,而没有任何与我的主代码并行的终止

sub somefunction{
 while(1){
   print $a+$b;
 }
}

my $a=1;
my $b=2;

somefunction(); #make it work without termination

#Main Body
while (1) {
   $c = <STDIN>;
   print $a+$b+$c;
}

这只是我想要做的事情,somefunction()应始终打印$a+$b,我已阅读过。我看过perl threads,但使用threads->create('somefunction', '');并没有给我任何期待的结果......

1 个答案:

答案 0 :(得分:2)

这是一个比你想象的更复杂的问题。线程可以解决问题,但是通过任何并行处理,您会遇到一些有趣的潜在问题。

线程是并行运行的子例程。但是,当它启动时,它会继承程序的内存状态,并使用它。

在您列出的示例中,$a$b不在您的子资源范围内,因此它不会做任何事情。 (注意 - 这些是使用不好的变量,因为sort会使用它们 - 因此,如果你误用它们,他们就会在strictwarnings下敲响警钟。 )。

这样的事情将会工作&#39;:

#!/usr/bin/perl
use strict;
use warnings;
use threads;

my $param_1 = 1;
my $param_2 = 2;

sub parallel_part {
    while ( 1 ) { 
        print $param_1 + $param_2, "\n";
        sleep 1;
    }
}


#Main Body

#start our thread...
my $thr = threads -> create ( \&parallel_part );


while (1) {
    my $input_value = <STDIN>;
    print $param_1 + $param_2 + $input_value,"\n";
 }

#wait for our thread to exit
#will never happen, because we've got two 'while true' loops. 
$thr -> join();

这虽然是一个人为的例子 - 真正的问题是你想要完成什么?&#39;。这只是反复打印&#39; 3&#39;一遍又一遍,因为你永远不会改变参数。 (如果您想从线程外部执行此操作,则需要使用threads::shared)。