我有点问题。我希望每次有来自套接字的新行时迭代循环,所以我使用这个循环:
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
,它只会在程序启动时进行一次。我能以某种方式同时运行两个循环吗?
答案 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