我正在尝试使用 Ruby 的 daemon gem 并循环重启具有自己循环的守护进程。我的代码现在看起来像这样:

require 'daemons'

while true
  listener = Daemons.call(:force => true) do
    users = accounts.get_updated_user_list

    TweetStream::Client.new.follow(users) do |status|
      puts "#{status.text}"
    end
  end
  sleep(60)
  listener.restart
end

运行这会给我以下错误(60 秒后):
undefined method `restart' for #<Daemons::Application:0x007fc5b29f5658> (NoMethodError)

所以很明显 Daemons.call 并没有像我认为的那样返回一个可控的守护进程。我需要做什么才能正确设置它。守护进程是正确的工具吗?

最佳答案

我认为这就是你所追求的,虽然我还没有测试过。

class RestartingUserTracker
  def initialize
    @client = TweetStream::Client.new
  end

  def handle_status(status)
    # do whatever it is you're going to do with the status
  end

  def fetch_users
    accounts.get_updated_user_list
  end

  def restart
    @client.stop_stream
    users = fetch_users
    @client.follow(users) do |status|
      handle_status(status)
    end
  end
end

EM.run do
  client = RestartingUserTracker.new
  client.restart

  EM::PeriodicTimer.new(60) do
    client.restart
  end
end

这是它的工作原理:

TweetStream 在内部使用 EventMachine,作为一种永远轮询 API 并处理响应的方式。我可以理解为什么您可能会感到卡住了,因为普通的 TweetStream API 会永远阻塞并且不会让您在任何时候进行干预。但是,TweetStream 确实允许您在同一事件循环中设置其他内容。在你的情况下,一个计时器。我在这里找到了有关如何执行此操作的文档:https://github.com/intridea/tweetstream#removal-of-on_interval-callback

通过启动我们自己的 EventMachine react 器,我们能够将我们自己的代码注入(inject)到 react 器中并使用 TweetStream。在这种情况下,我们使用一个简单的计时器,它每 60 秒重新启动一次客户端。

EventMachine 是一种叫做 Reactor 模式的实现。如果你想完全理解和维护这段代码,找到一些关于它的资源并获得一个完整的理解对你很有帮助。 react 堆模式非常强大,但一开始可能很难掌握。

但是,此代码应该可以帮助您入门。另外,我会考虑将 RestartingUserTracker 重命名为更合适的名称。

关于ruby - 如何循环重启守护进程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13132682/

10-14 04:49