无论运行循环中发生什么,每隔几秒执行一次操作

时间:2015-03-10 22:12:02

标签: ruby loops delay

我有点问题。我希望每次有来自套接字的新行时迭代循环,所以我使用这个循环:

until @socket.eof? do
  #something
end

我还希望每10秒执行一次动作,所以我做了类似的事情:

until @socket.eof? do
  do_something

  if time_last+10 < Time.now 
    time_last = Time.now
    do_something_else
  end 
end

我的问题是,只有在套接字上有新行后才会执行do_something_else操作。如果有100行/秒,则没有问题。但如果没有新的线路,没有任何事情发生。 如果我在if循环之外得到整个until,它只会在程序启动时进行一次。我能以某种方式同时运行两个循环吗?

2 个答案:

答案 0 :(得分:1)

您可以安排任务,最好的方法是使用调度程序。

您可以使用OpenWFEru执行此操作,然后:

  

scheduler.schedule_every(&#39; 10s&#39;){do_something}

请参阅以下链接中的更多内容: https://www.igvita.com/2007/03/29/scheduling-tasks-in-ruby-rails/

答案 1 :(得分:1)

你不必阻塞套接字。在此循环中,它尝试读取0.2秒,然后检查是否必须启动任务。 $ guest是一组套接字。

loop do
  if task_time + 0.1 < now = Time.now.to_f
    Task.execute(task_time = now)
  end
  next unless ready = select($guest, nil, nil, 0.2)
  now = Time.now.to_f
  for sock in ready[0]
  // [...]
  end
end

这是我的一些遗留代码的摘录,但确实有效:

https://github.com/rosedomini/MystMUD/blob/master/MystMUD/myst/myst/mud.rb