【问题标题】:Run a deamon loop without eating all the CPU (Perl)在不占用所有 CPU 的情况下运行守护程序循环 (Perl)
【发布时间】:2013-07-09 15:13:03
【问题描述】:

我有以下代码:

use Proc::Daemon;

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

while ($continue) {
     ##DO THINGS
}

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

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

【问题讨论】:

    标签: perl events daemon infinite-loop


    【解决方案1】:

    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。最后一个参数是您愿意等待的最长时间(timeout 值)。

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

    【讨论】:

    • 事件循环如何做到不休眠?
    • @johndoe 为您更新了答案。请阅读有关select() 函数调用的信息。
    【解决方案2】:

    查看 http://perldoc.perl.org/POSIX.html 并搜索 /nice/。

    不错

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

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use POSIX;
    
    POSIX::nice( 19 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2012-05-19
      • 2016-03-09
      相关资源
      最近更新 更多