Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在完成时或在指定的时间之后结束线程,以Perl中最先发生的为准_Multithreading_Perl - Fatal编程技术网

Multithreading 在完成时或在指定的时间之后结束线程,以Perl中最先发生的为准

Multithreading 在完成时或在指定的时间之后结束线程,以Perl中最先发生的为准,multithreading,perl,Multithreading,Perl,我在Perl线程方面遇到了一些问题,需要您的帮助 我想在perl中运行一些任务[adb execute some command]。我的要求是在execute命令完成后退出循环/线程,或者在指定的时间(比如3小时)后终止执行任务本身。为此,我尝试使用线程 任务1-将执行某些事情-可能需要更少或更多的时间 任务2-3小时计时器 因此,它正在部分发挥作用。我的意思是在ADB任务完成后退出循环,但不是以另一种方式 <pre> use threads; my $thr = threa

我在Perl线程方面遇到了一些问题,需要您的帮助

我想在perl中运行一些任务[adb execute some command]。我的要求是在execute命令完成后退出循环/线程,或者在指定的时间(比如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>

使用线程;
我的$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 );