私はそれをテストしていませんが、これはあなたが求めているものだと思います。
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 の名前をより適切なものに変更することを検討します。