背景:
在阅读如何多线程我的Perl脚本,我读(从http://perldoc.perl.org/threads.html#BUGS-AND-LIMITATIONS)如何将perl子例程排队到线程队列而不是数据?
在大多数系统中,频繁的和持续的创造和 线程破坏可导致不断增加Perl解释器的内存占用量增长了 。虽然启动线程和 然后 - > join()或 - > detach()它们对于长时间运行的应用程序来说很简单,但它更好地维护一个线程池并重用它们以用于工作 需要,使用队列通知待处理工作的线程。
我的脚本将是长寿的;这是一个始终运行的PKI LDAP目录监视守护进程。如果企业监控解决方案因任何原因停止运行,则会生成警报。我的脚本将检查我是否可以访问另一个PKI LDAP目录,并验证两者上的撤销列表。
问题:一切我可以找到关于谷歌显示传递变量(如标量)的线程队列,而不是子程序本身......我想我只是不理解如何实现一个线程队列正确相比,你如何实现一个线程(没有队列)。
问题1:我怎样才能“维持的线程池”,以避免慢慢地吃起来越来越多的内存Perl解释?
问题2 :(不相关,但我有这段代码张贴)在主程序结束时是否有安全的睡眠量,以便我不会在一分钟内多次启动一个线程? 60看起来很明显,但如果循环速度很快,可能会导致它运行多次,或者由于处理时间或某种原因可能会错过一分钟?
在此先感谢!
#!/usr/bin/perl
use feature ":5.10";
use warnings;
use strict;
use threads;
use Proc::Daemon;
#
### Global Variables
use constant false => 0;
use constant true => 1;
my $app = $0;
my $continue = true;
$SIG{TERM} = sub { $continue = false };
# Directory Server Agent (DSA) info
my @ListOfDSAs = (
{ name => "Myself (inbound)",
host => "ldap.myco.ca",
base => "ou=mydir,o=myco,c=ca",
},
{ name => "Company 2",
host => "ldap.comp2.ca",
base => "ou=their-dir,o=comp2,c=ca",
}
);
#
### Subroutines
sub checkConnections
{ # runs every 5 minutes
my (@DSAs, $logfile) = @_;
# Code to ldapsearch
threads->detach();
}
sub validateRevocationLists
{ # runs every hour on minute xx:55
my (@DSAs, $logfile) = @_;
# Code to validate CRLs haven't expired, etc
threads->detach();
}
#
### Main program
Proc::Daemon::Init;
while ($continue)
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
# Question 1: Queues??
if ($min % 5 == 0 || $min == 0)
{ threads->create(&checkConnections, @ListOfDSAs, "/var/connect.log"); }
if ($min % 55 == 0)
{ threads->create(&validateRevocationLists, @ListOfDSAs, "/var/RLs.log"); }
sleep 60; # Question 2: Safer/better way to prevent multiple threads being started for same check in one matching minute?
}
# TERM RECEIVED
exit 0;
__END__
愚蠢的问题:为什么使用线程?为什么不一次检查一个DSA? – 2013-04-25 13:14:57
有效的问题! a)服务器有很多内核,所以我想“为什么不使用它们?”和b)我是一个极客,并且想要为未来的脚本学习正确的线程技术(我讨厌以简单的方式出局)。如果发现问题,子例程将SNMP陷阱发送到集中式监视服务器,所以我的主脚本并不真正在意返回值,所以这感觉就像是要走的路。 – static 2013-04-25 13:42:41
我可以将这些原因联系起来,但我认为在这种情况下,除非有令人信服的理由使用它们,否则不应该增加线程的复杂性。 – 2013-04-25 14:14:22