在完成时或在指定时间之后结束线程,以Perl

时间:2015-05-12 19:17:24

标签: multithreading perl

我遇到了Perl Threading的一些问题,需要你的帮助。

我想在perl中运行一些任务[adb执行一些命令]。我的要求是在执行命令完成后退出循环/线程,或者在指定的时间[比如3小时]后终止执行任务。为此,我试图使用:线程

任务1 - 执行某些事情 - 可能需要更少或更多时间 任务2 - 3小时的定时器

所以它正在部分运作。我的意思是,一旦ADB任务完成,退出循环,而不是相反。

<pre>
use threads;
    my $thr = threads->create(\&sub1);   # Spawn the thread
    $thr->detach();   # Now we officially don't care any more
    my $thr = threads->create(\&sub2);   # Spawn the thread
    $thr->join();   
    #sleep_string(10);        # Let thread run for awhile
    sub sub1 {
       sleep(10800); 
    }        
    sub sub2 {
       Execute ADB task
    }        
</pre>

1 个答案:

答案 0 :(得分:0)

继续发表评论之后,我的建议就是根本没有线索。这个看起来像一个你正在运行的简单系统命令,你想在超时后杀死它。

所以我会这样做:

#!/usr/bin/perl

use strict;
use warnings;

alarm 3; 
my $pid = open ( my $output_from_proc, "-|", "tail -f /var/log/messages" ); 
$SIG{'ALRM'} = sub { 
    print "Killing $pid because of timeout\n"; 
    kill 15, $pid 
    undef $SIG{'ALRM'}; #irrelevant unless you reuse alarm
};
print <$output_from_proc>; 
waitpid ( $pid, 0 ); 

open作为可执行文件打开,并执行它自己的fork - 并通过STDOUT返回$output_from_proc。您设置了'ALRM'信号处理程序。 alarm请求内核在指定的时间之后向您发送SIGALRM(它非常精确,但超过了超时)。

当你的ALRM信号到来时,这个过程就会被杀死。如果你真的想要这应该在一个线程中工作,但我会尽量避免它。