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

Performing action every few seconds, no matter what happens in running loop

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

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行/秒就没有问题。但如果没有新行,则什么也不会发生。 如果我在 until 循环之外得到整个 if,它只会在程序启动时运行一次。我可以 运行 以某种方式同时进行两个循环吗?

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

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

scheduler.schedule_every('10s') { do_something }

在下面的 link 中查看更多内容: https://www.igvita.com/2007/03/29/scheduling-tasks-in-ruby-rails/

您不必阻塞套接字。在此循环中,它尝试读取 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