[英]Perl Threads - Capture Exit
我有产生两个线程的代码。 第一个是启动应用程序的系统命令。 第二个监视程序。 我是Perl线程的新手,所以我有几个问题。
my $thr1 = threads->new(system($cmd));
sleep(FIVEMINUTES);
my $thr2 = threads->new(\&check);
my $rth1 = $thr1->join();
my $rth2 = $thr2->join();
1)我是否需要第二个线程来监视程序? 您可以将我对&check的子例程调用视为一个无限的while循环,该循环检查文本文件中应用程序生成的内容。 我可以这样做吗?
my $thr1 = threads->new(system($cmd));
sleep(FIVEMINUTES);
✓
2)我试图弄清楚我的父母在我运行这段代码后在做什么。 因此,在启动第1行之后,它将生成该新线程,进入睡眠状态,然后生成第二个线程,然后坐在该第一个连接处并等待。 直到第一次连接时,它才会执行其余的代码。 这是正确的还是我错了? 如果我错了,那它如何工作?
3)我的第一个线程启动应用程序可能被意外杀死。 当这种情况发生时,我什么也无法抓住并杀死线程。 它只是说:“线程1异常终止:未定义的子例程&main :: 65280在myScript.pl第109行调用。” 然后挂在那里。
我该怎么做才能结束其他线程? 我需要它在程序结束之前发送电子邮件,这可以通过调用&email(我创建的另一个子例程)来完成。
谢谢
首先,
my $thr1 = threads->new(system($cmd));
应该
my $thr1 = threads->new(sub { system($cmd) });
或简单地
my $thr1 = async { system($cmd) };
您不需要启动第三个线程。 如您所怀疑,主线程和一个执行system
就足够了。
如果命令在不到五分钟的时间内完成执行该怎么办? 以下内容将睡眠替换为信号。
use threads;
use threads::shared;
my $done :shared = 0;
my $thr1 = async {
system($cmd);
lock($done);
$done = 1;
cond_signal($done);
};
{ # Wait up to $timeout for the thread to end.
lock($done);
my $timeout = time() + 5*60;
1 while !$done && cond_timedwait($done, $timeout);
if (!$done) {
... there was a timeout ...
}
}
$thr1->join();
在2004-2006年间,我在Winblows上以24/7运行perl应用程序时遇到了同样的挑战...唯一可行的方法是使用磁盘上的xml状态文件来传达系统每个组件的状态...并确保是否在关闭代码块{}
发生的每个状态文件处理都使用线程(大陷阱)该应用程序在100台24/7机器上运行了至少3年,没有错误...如果您使用的是类似Unix的操作系统,我建议您使用fork和进程间通信。 使用cpan模块,请勿重新发明轮子。
Perl中的多线程处理起来有些困难,我建议改用fork()命令。 我将尽我所能回答您的问题。
1)在我看来,这里需要两个线程/进程,因为您需要异步检查数据。
2)您的父母完全按照您的描述工作。
3)线程挂起的原因可能是您从未终止第二个线程。 您说这是一个无限循环,是否有退出条件?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.