每隔几秒执行一次操作,无论 运行 循环中发生什么
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
我有个小问题。每次有来自套接字的新行时,我都想迭代循环,所以我使用这个循环:
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