gpt4 book ai didi

multithreading - Perl 线程 - 捕获退出

转载 作者:行者123 更新时间:2023-12-03 12:49:30 25 4
gpt4 key购买 nike

我有生成两个线程的代码。第一个是启动应用程序的系统命令。第二个监视程序。我是 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)我试图弄清楚我的 parent 在运行此代码后在做什么。因此,在我启动第 1 行之后,它将生成新线程、 sleep ,然后生成第二个线程,然后坐在第一个连接处等待。在第一次加入之前,它不会执行我的其余代码。这是正确的还是我错了?如果我错了,那么它是如何工作的?

3) 我的第一个线程(启动应用程序的线程)可能会被意外终止。当这种情况发生时,我没有什么可以捕捉到并杀死线程。它只是说:“线程 1 异常终止:在 myScript.pl 第 109 行调用了未定义的子例程 &main::65280。”然后卡在那里。

我该怎么做才能让它结束其他线程?我需要它在程序结束之前发送一封电子邮件,我可以通过调用 &email (我制作的另一个子例程)来完成。

谢谢

最佳答案

首先,

my $thr1 = threads->new(system($cmd));

应该是

my $thr1 = threads->new(sub { system($cmd) });

或者简单地

my $thr1 = async { system($cmd) };

您不需要启动第三个线程。正如您所怀疑的,主线程和执行系统的线程就足够了。


如果命令在不到五分钟内完成执行怎么办?下面用信号代替 sleep 。

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();

关于multithreading - Perl 线程 - 捕获退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com