2017-03-17 5 views
2

私はlibevを学んでおり、私はこの質問に遭遇しました。できるだけ早く(現在実行中の機能ではない)何かを処理したいとします。たとえば、いくつかの大きな同期ジョブを複数のピースに分割して、他のコールバックが間に入るようにキューに入れたいとします。言い換えれば、タイムアウト0でコールバックをスケジュールしたいと思っています。Libev:できるだけ早く呼び出されるようにコールバックをスケジュールする方法

最初の考えはev_timerとタイムアウト0を使用することです。最初の質問は、それは効率的ですか? libevは0タイムアウトタイマーを効率的な "できるだけ早く呼び出す"ジョブに変換できますか?私はそうではないと思う。

私はlibev's docsを掘りしてきたと私は他のオプションが見つかりました:

それが人為的に準備またはアイドルウォッチャーを使用して、コールバックを呼び出す遅らせることができ

だから、アイドルウォッチャーであります

アイドルウォッチャーは、同じまたはより高い優先度の他のイベントが未処理の場合にイベントをトリガーします。

これはおそらく私が望むものではありません。準備をするウォッチャーはここで働くかもしれません。しかし、ウォッチャーをチェックしてみませんか?私が話している文脈には、何らかの犯罪的な違いはありますか?これらのドキュメントが示唆

他のオプションは次のとおりです。

以上こそこそ、既存の(停止)再利用ウォッチャーと保留キューにそれを押して:

ev_set_cb (watcher, callback); 
ev_feed_event (EV_A_ watcher, 0); 

しかし、それは希望常にウォッチャーを停止する必要があります。また私は先験的に、同時に複数の呼び出しを予定しているので、複数のウォッチャーを持っていなければならず、さらにいくつかの種類のリストを介して追跡し、必要なときに増やす必要があります。

私は正しい軌道に乗っていますか?これらのすべての可能性はありますか?

答えて

0

ウォッチャーev_prepareをチェックしてみてください。これは、与えられたイベントループ反復において最後のハンドラとして実行されるようにスケジューリングされます。このタスクをできるだけ早く実行するために使用することができます。実行するタスクごとに専用のウォッチャーを作成することも、キューに少なくとも1つのタスクが含まれている場合に開始されるウォッチャーを使用してキューを実装することもできます。

ev_idle watcherを使用して同様のメカニズムを実装することもできますが、今回はアプリケーションが「優先度の高い」ウォッチャーハンドラを処理しない場合にのみ実行されます。

関連する問題