4

Ruby のdaemongem を使用して、独自のループを持つデーモンの再起動をループしようとしています。私のコードは次のようになります。

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、私が思うように制御可能なデーモンを返しません。これを正しく設定するにはどうすればよいですか。デーモンはここで適切なツールですか?

4

1 に答える 1

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 は、API を永続的にポーリングして応答を処理する方法として、EventMachine を内部的に使用します。通常の TweetStream API は永久にブロックされ、どの時点でも介入する方法が提供されないため、行き詰まりを感じた理由がわかります。ただし、TweetStream では、同じイベント ループ内に他のものを設定できます。あなたの場合、タイマー。ここでそれを行う方法に関するドキュメントを見つけました: https://github.com/intridea/tweetstream#removal-of-on_interval-callback

独自の EventMachine リアクターを起動することで、独自のコードをリアクターに挿入したり、TweetStream を使用したりできます。この場合、60 秒ごとにクライアントを再起動する単純なタイマーを使用しています。

EventMachine はReactor Patternと呼ばれるものの実装です。このコードを完全に理解して維持したい場合は、それに関するリソースを見つけて完全に理解することが役に立ちます。リアクター パターンは非常に強力ですが、最初は把握するのが難しい場合があります。

ただし、このコードから始める必要があります。また、RestartingUserTracker の名前をより適切なものに変更することを検討します。

于 2012-11-01T21:33:13.953 に答える