我正在编写的 Ruby 程序遇到一个奇怪的问题。
基本上,这个想法是让程序在后台持续运行。该程序每 30 秒检查一次我的浏览器历史记录,并将所有新的历史记录项目上传到服务器。
# client.rb
history = HistoryUploader.new(Chrome)
# Run everything
loop do
history.run
sleep 30
end
HistoryUploader
类的重要部分如下所示
class HistoryUploader
def run
upload_history until local.last_seen_history_item == server.last_seen_history_item
end
def upload_history
# POST batches of history items to the server
end
end
我在这段代码中看到的主要问题是,如果 HistoryUploader.run
需要超过 30 秒才能完成(这很可能是因为它正在发送多个 http 请求),则外部循环client.rb
将尝试再次调用 run
,我可能会收到发送到服务器的并行请求,这确实会造成困惑。
有没有办法可以阻止 run
方法被调用两次,直到它完成为止?
最佳答案
我认为您没有遇到您认为的问题。您描述代码的方式仍然是单线程的。您没有启动一个新线程来执行history.run,这意味着在您的history.run方法返回之前,sleep 30不会被执行。
您是否需要使该线程基于您正在寻找的行为。如果您想在history.run 完成后30 秒触发对history.run 的另一次调用,您的代码现在就会执行此操作。如果您希望每 30 秒运行一次,而与history.run 的执行时间无关(例如,history.run 需要 7.5 秒,因此您希望在 22.5 秒内再次运行查询),那么线程解决方案可能是最合适的解决方案。优雅。
关于ruby - 如何判断方法或循环是否已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053627/