我正在尝试使用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
不会像我认为的那样返回可控制的守护进程。我需要做什么才能正确设置它。守护进程是否是正确的工具?
答案 0 :(得分:3)
我认为这就是你所追求的,尽管我还没有测试过它。
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反应器,我们可以将自己的代码注入反应器并使用TweetStream。在这种情况下,我们使用的是一个简单的计时器,它只需每60秒重启一次客户端。
EventMachine是一个名为 Reactor Pattern 的实现。如果您想要完全理解和维护这些代码,那么找到一些有关它的资源并获得完整的理解将很有用。反应堆模式非常强大,但最初很难掌握。
但是,此代码应该可以帮助您入门。另外,我会考虑将RestartingUserTracker重命名为更合适的东西。