1

我有一个邮件解析器 perl 脚本,每次用户收到邮件时都会调用它(使用 .qmail)。它从邮件中提取日历附件,并将文件的“路径”放入使用Directory::Queue 模块实现的 FIFO 队列中。

另一个 perl 脚本读取日历附件的路径并在本地系统和远程 CalDAV 服务器上执行某些文件操作,正在作为守护程序运行,如此所述。所以基本上这个脚本看起来像:

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 的链接中提到的代码几乎相同。

4

3 回答 3

3

我敢打赌这是你的 for 循环并检查新的队列条目。

有多种方法可以监视目录中的文件更改。这些方式取决于操作系统,但可能有一个 Perl 模块为您包装它们。使用它而不是忙循环。即使有睡眠延迟,当你可以让你的程序准确地告诉你什么时候被操作系统事件唤醒时,循环也是低效的。

File::ChangeNotify看起来很有希望。

于 2011-01-21T23:00:02.107 回答
1

也许您不想要真正的连续轮询。keep-checking-the-queue-for-new-entries即使队列为空,代码的 CPU 密集型部分是否也是如此?这可以解释为什么你的处理器总是很忙。

尝试sleep 1在循环的最顶部(或最底部)放置一条语句,while让处理器在队列检查之间休息。如果这不会过多地降低程序性能(即,如果每个人都可以容忍在公司日历更新之前多等一秒)并且如果 CPU 使用率看起来仍然很高,请尝试sleep 2,sleep 5等。

于 2011-01-21T20:41:27.597 回答
1
cpan Linux::Inotify2

内核知道文件何时更改并将此信息发送到运行子程序的程序。也许这会更好,因为程序仅在文件更改时才会运行子程序。

于 2011-09-12T07:41:52.930 回答