Ruby 如何循环重新启动守护进程?

Ruby 如何循环重新启动守护进程?,ruby,daemons,tweetstream,Ruby,Daemons,Tweetstream,我正在尝试使用Ruby的守护进程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.

我正在尝试使用Ruby的守护进程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和处理响应的一种方式。我可以理解为什么您可能会感到卡住,因为正常的TweetStreamAPI会永远阻塞,并且在任何时候都不会给您提供干预的方式。但是,TweetStream允许您在同一事件循环中设置其他内容。在你的情况下,一个计时器。我在这里找到了关于如何做到这一点的文档:

通过启动我们自己的EventMachine反应器,我们能够将自己的代码注入反应器,并使用TweetStream。在本例中,我们使用一个简单的计时器,每60秒重新启动一次客户机

EventMachine是一种称为Reactor模式的实现。如果您想完全理解和维护这段代码,那么找到一些关于这段代码的资源并获得充分的理解将对您很有帮助。反应堆模式非常强大,但一开始很难掌握


但是,这段代码应该可以帮助您开始。另外,我会考虑将RestActualUrrTrrar重命名为更合适的。

你的意图到底是什么?我不知道你想做什么,但我猜你走错了方向。为什么要每60秒重新启动一次守护进程?我正在使用Tweetstream gem从用户列表中获取推文。每分钟或10分钟或任何我想重新生成该用户列表,然后重新启动Tweetstream客户端的时间。我将更新示例代码以更好地反映这一点。这看起来非常好!看起来我也应该学习更多关于EventMachine的知识。我明天会测试这个问题,然后总结这个问题。谢谢