运行守护进程循环而不吃掉所有CPU(Perl)

时间:2013-07-09 15:13:03

标签: perl events daemon infinite-loop

我有以下代码:

use Proc::Daemon;

Proc::Daemon::Init;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };

while ($continue) {
     ##DO THINGS
}

我注意到这个脚本使用的是7%的CPU。我相信这是因为无限循环。我相信有一种方法可以使无限循环不使用太多CPU(这就是事件循环的工作方式)。我怎么能不使用大量的CPU(我想我可以睡觉,但我想知道是否有更好的方法)。

我所做的“事情”本质上非常简单。检查定时器是否已过期或是否设置了标志。如果是,请采取行动。

2 个答案:

答案 0 :(得分:3)

select功能允许您进行亚秒级睡眠。 e.g:

# sleep for 100ms (0.1 seconds)
select( undef, undef, undef, 0.1 );

<强>更新

事件循环通常围绕select来电。 select()函数告诉操作系统将进程置于休眠状态,直到文件句柄列表中的某个文件句柄发生了一些有趣的事情(“可用于读取的数据”,“可用于写入的缓冲区”或“出错的文件句柄”)

您提供给select()的三个参数是 filehandles_to_read filehandles_to_write filehandles_to_monitor_for_error 。最后一个参数是您愿意等待的最长时间(超时值)。

当您致电select( undef, undef, undef, 0.1 )时,您根本没有要求操作系统唤醒任何文件句柄,但超时值仍然有效并在此期间后唤醒程序。

答案 1 :(得分:2)

请参阅http://perldoc.perl.org/POSIX.html并搜索/ nice /.

  

<强>好的

     

这类似于C函数nice(),用于更改调度   当前进程的偏好。积极的论点意味着更有礼貌   过程中,负值更有需要的过程。普通用户进程可以   只是更有礼貌。

#!/usr/bin/env perl

use strict;
use warnings;

use POSIX;

POSIX::nice( 19 );