我有一个邮件解析器perl脚本,每次邮件到达用户时都会调用该脚本(使用.qmail)。它从邮件中提取日历附件,并将文件的“路径”放在使用Directory::Queue module实现的FIFO队列中。
另一个读取日历附件路径并在本地系统以及远程CalDAV服务器上执行某些文件操作的perl脚本正在作为守护程序运行,如here所述。所以基本上这个脚本看起来像:
my $declarations
sub foo {
.
.
}
sub bar {
.
.
}
while ($keep_running) {
for(keep-checking-the-queue-for-new-entries) {
sub caldav_logic1 {
.
.
}
sub caldav_logic2 {
.
.
}
}
}
我正在使用Proc :: Daemon将脚本作为守护进程运行。现在的问题是,这个过程几乎有100%的CPU使用率。有哪些建议的方法以更标准,更安全的方式实现守护进程?我使用与提到的Proc :: Daemon的链接中提到的代码几乎相同的代码。
答案 0 :(得分:3)
我敢打赌,这是你的for循环并检查新的队列条目。
有多种方法可以查看目录以进行文件更改。这些方式取决于操作系统,但可能有一个Perl模块可以为您提供包装。使用它而不是繁忙的循环。即使有睡眠延迟,当您可以让您的程序准确告知何时通过OS事件唤醒时,循环效率也很低。
File::ChangeNotify看起来很有希望。
答案 1 :(得分:1)
也许你不想要真正持续的民意调查。即使队列为空,keep-checking-the-queue-for-new-entries
是代码的CPU密集型部分吗?这可以解释为什么你的处理器总是很忙。
尝试在sleep 1
循环的最顶部(或最底部)放置while
语句,让处理器在队列检查之间休息。如果这不会使程序性能降低太多(即,如果每个人都可以忍受在公司日历更新之前等待额外的一秒)并且如果CPU使用率仍然很高,请尝试sleep 2
,sleep 5
等等。
答案 2 :(得分:1)
cpan Linux::Inotify2
内核知道文件何时更改并将此信息发送到运行sub的程序。也许这样会更好,因为只有在文件发生变化时,程序才会运行sub。