繁体   English   中英

Perl线程-捕获出口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM