Multithreading 在完成时或在指定的时间之后结束线程,以Perl中最先发生的为准
我在Perl线程方面遇到了一些问题,需要您的帮助 我想在perl中运行一些任务[adb execute some command]。我的要求是在execute命令完成后退出循环/线程,或者在指定的时间(比如3小时)后终止执行任务本身。为此,我尝试使用线程 任务1-将执行某些事情-可能需要更少或更多的时间 任务2-3小时计时器 因此,它正在部分发挥作用。我的意思是在ADB任务完成后退出循环,但不是以另一种方式Multithreading 在完成时或在指定的时间之后结束线程,以Perl中最先发生的为准,multithreading,perl,Multithreading,Perl,我在Perl线程方面遇到了一些问题,需要您的帮助 我想在perl中运行一些任务[adb execute some command]。我的要求是在execute命令完成后退出循环/线程,或者在指定的时间(比如3小时)后终止执行任务本身。为此,我尝试使用线程 任务1-将执行某些事情-可能需要更少或更多的时间 任务2-3小时计时器 因此,它正在部分发挥作用。我的意思是在ADB任务完成后退出循环,但不是以另一种方式 <pre> use threads; my $thr = threa
<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>
使用线程;
我的$thr=线程->创建(\&sub1);#产生线程
$thr->detach()#现在我们正式不在乎了
我的$thr=threads->create(\&sub2);#产生线程
$thr->join();
#睡眠(10);#让线程运行一会儿
子项1{
睡眠(10800);
}
次级款2{
执行ADB任务
}
根据这些评论,我的建议是根本不要使用线程。这看起来像是您正在运行的简单系统命令,您希望在超时后终止
所以我会这样处理:
#/usr/bin/perl
严格使用;
使用警告;
警报3;
my$pid=open(my$output_from_proc,“-|”,“tail-f/var/log/messages”);
$SIG{'ALRM'}=sub{
打印“由于超时而终止$pid\n”;
杀掉15美元
undef$SIG{'ALRM'};#除非重新使用报警,否则与此无关
};
印刷品;
waitpid($pid,0);
open
作为一个可执行文件打开,并执行它自己的fork-并通过$output\u from\u proc
返回STDOUT
。您设置了一个“ALRM”信号处理程序alarm
请求内核在指定的时间之后向您发送一个SIGALRM
(它非常精确,但对于超时来说已经足够了)
当您的
ALRM
信号发出时,进程被终止。如果你真的想,这应该在一个线程内工作,但我会尽量避免它 当超时发生时,您可以向线程发送“线程信号”。如果您想干净地退出,您需要一个处理程序捕捉该信号并die
。(这仅在操作由Perl代码组成时有效,因为“线程信号”只在Perl指令之间进行检查。)这是简单的部分。最难的部分是等待线程完成或计时器结束。它必须是线程吗?因为alarm()
和fork()
的组合很容易做到这一点。谢谢ikegami,我会检查一下,让你知道谢谢Sobrique,它不一定是一个线程,所以请你再给一些输入Hanks Sobrique,一个疑问是,如果$output\u from\u proc在ALRM/timeout之前完成,那么它将如何退出当它这样做时,$output\u from\u proc
文件句柄将关闭,并且您在读取它时将得到一个EOF。或者你可以通过waitpid
测试它是否已经退出-它将作为一个僵尸呆在那里,直到它被重新获得。抱歉,回复延迟/非常感谢Sobrique。它工作得很好。
#!/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 );