sleep()对于作业调度应用程序的主循环来说是一个好主意

Yoa*_*che 8 ruby multitasking job-scheduling

我正在Ruby中为我的工作编写一个作业调度应用程序(主要是在给定频率下使用各种协议移动文件)

我的主循环看起来像这样:

while true do
  # some code to launch the proper job
  sleep CONFIG["interval"]
end
Run Code Online (Sandbox Code Playgroud)

它的工作就像一个魅力,但我不确定它是否足够安全,因为应用程序可能在运行cpu密集型软件的服务器上运行.

还有另一种方法可以做同样的事情,或者sleep()在我的情况下是否足够安全?

jro*_*way 7

每当我觉得需要阻止时,我都会使用一个事件循环; 通常是自由的.这是一个Ruby绑定:

http://rev.rubyforge.org/rdoc/

基本上,sleep如果你希望你的过程在没有任何其他事情发生的情况下进入睡眠状态,那就完全没问题了.但是,如果您想要做其他事情,比如睡眠,还等待TCP连接或文件句柄变得可读,那么您将不得不使用事件循环.那么,为什么不在开始时使用一个呢?

您的申请流程将是:

main {
   Timer->new( after => 0, every => 60 seconds, run => { <do your work> } )
   loop();
}
Run Code Online (Sandbox Code Playgroud)

当你想做其他事情时,你只需创建观察者,它就会发生在你身上.(您正在运行的作业也可以创建观察者.)


For*_*ker 6

对于快速和肮脏的事情,使用睡眠可能是好的.但是对于需要更强大或可靠性的东西,我建议睡眠是邪恶的:)睡眠的问题是线程(我假设Windows在这里......)真的睡着了 - 调度程序不会运行线程直到睡眠间隔过去一段时间后.

在此期间,线程不会唤醒任何东西.这意味着它无法取消,或唤醒以处理某种事件.当然,这个过程可以被杀死,但这并没有给睡眠线程提供唤醒和清理任何东西的机会.

我不熟悉Ruby,但我认为它有一些等待多种功能的工具.如果可以的话,我建议你不要使用睡眠,而是要对两件事情嗤之以鼻

  1. 定时唤醒线程以完成其工作的计时器.
  2. 在进程需要取消或完全取消时设置的事件(例如,捕获control-C).

如果有某种事件可以用来表明需要做什么,那就更好了.这样可以避免在计时器上进行轮询.这通常会导致资源利用率降低和系统响应速度更快.