QA@IT

EventMachineでセットしたタイマーのリストを取得する方法

2339 PV

EventMachineのadd_periodic_timerでセットしたタイマーの一覧を取得するようなメソッドはあるのでしょうか?
(EventMachine::Timerクラスのドキュメントを見た限りだと、newとcancelのメソッドしか無さそうでした。)

Class: EventMachine::Timer

また、cancelメソッドによってキャンセルしたタイマーは、そのまま放置していてよいものなのでしょうか?(タイマーを削除するというメソッドが見当たらなかったため、メモリリークの心配をしています。)

サンプル:

EM.run do
  EM.add_periodic_timer( 60 ) do
    puts "[ #{Time.now.strftime("%Y/%m/%d %H:%M:%S")} ]"
  end
end

実際に行いたい処理は下記のようなものです。

  • タイマーがセットされていたら、一度全てのタイマーを削除し、タイマーをセットし直す。
  • タイマーがセットされていたら何もしないが、タイマーがセットされていなければタイマーをセットする。

回答

軽くソースコードを読んで解析した結果なので間違いを含むかもしれませんが御容赦ください。読んだのはeventmachine-0.12.10です。

  • 任意の設定したタイマーの一覧などというものは管理されていないように見えます。しかしながらadd_periodic_timerだけでよいのであれば、

    EventMachine.instance_eval{@timers}.keys
    

    の中に含まれているように見えます。ただし、add_periodic_timerではないタイマーも含まれていそうです。

  • タイマーをキャンセルしてもコールバックを呼ばないだけでタイマーのディスクリプタはリークしたままになっているように見受けられます。ext/em.cpp を読む限りでは一度設定してリアクターのレベルにまで落ちていったタイマーを停止する方法は提供されていません。

    • しかしながら、最初にタイマーを登録したタイミングが過ぎると、(コールバックは動かないけど)タイマー自体は開放されているように見受けられます。つまりキャンセルした瞬間はリークしてるけど長い目で見れば回収される。

以上、お役に立てば幸いですが、正直あまりうれしくない解析結果で、残念な感じです。

編集 履歴 (0)
  • おー、ありがとうございます。
    ドキュメントに無ければソース読めって事ですね。。
    参考になりました。ありがとうございます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。