我有以下代码:
use Proc::Daemon;
Proc::Daemon::Init;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };
while ($continue) {
##DO THINGS
}
我注意到这个脚本使用的是7%的CPU。我相信这是因为无限循环。我相信有一种方法可以使无限循环不使用太多CPU(这就是事件循环的工作方式)。我怎么能不使用大量的CPU(我想我可以睡觉,但我想知道是否有更好的方法)。
我所做的“事情”本质上非常简单。检查定时器是否已过期或是否设置了标志。如果是,请采取行动。
答案 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 );