ruby - 如何判断方法或循环是否已完成?

标签 ruby

我正在编写的 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/

相关文章:

ruby-on-rails - 如何优雅地检查对象和关联对象是否存在?

javascript - 悬停链接时创建弹出窗口,就像在 facebook 中将光标放在链接上时一样,它会显示发送消息等选项

ruby - 如何有效地轮询大量服务器?

mysql - ruby /散列:ActiveSupport::HashWithIn DifferentAccess

ruby - 将 SHA1 密码转换为其二进制形式

ruby - 我可以将多个参数传递给 Ruby 中的重载运算符吗?

ruby - 如何漂亮地打印到变量而不是 STDOUT?

ruby-on-rails - 在 ROR 中将字符串和整数的组合中的整数相乘

sql - 在 ActiveRecord/Arel (Rails 4) 中进行联合交集的有效方法?

ruby - 如何在dynamodb查询操作中使用通配符*?