2

我有以下代码:

use Proc::Daemon;

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

while ($continue) {
     ##DO THINGS
}

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

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

4

2 回答 2

3

select功能允许您进行亚秒级睡眠。例如:

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

更新

事件循环通常select调用为中心。该select()函数告诉操作系统让您的进程进入睡眠状态,直到文件句柄列表中的一个发生有趣的事情(“可读取的数据”、“可写入的缓冲区”或“错误的文件句柄”)。

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

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

于 2013-07-09T15:14:51.840 回答
2

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

好的

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

#!/usr/bin/env perl

use strict;
use warnings;

use POSIX;

POSIX::nice( 19 );
于 2013-07-09T16:48:25.413 回答