2

select誰かがPythonで、 Python stdlibからの標準的なバインディングに対するpyevの速度と有用性を測定しましたか?

pyevを使用する利点は何selectですか?

pyevはC拡張機能によって構築されているため、移植性のあるソリューションではありません。PyPyでビルドしようとしましたが、箱から出してすぐに成功しませんでした。
だから私はそれを使う価値があるかどうか疑問に思っています。

geventが1.0バージョンで(そしてlibeventを使用する前に)libevを使用していることを私は知っています。彼らは本当にそれを必要としていますか?イベントループ以外の機能(libeventのDNSなど)は気にしません。

4

1 に答える 1

2

Pythonのselectモジュールは、select()、poll()、epoll()のシステムコールのラッパーにすぎませんが、libevとlibeventはイベントループを実装しています。イベントループは、ウォッチャーとタイマーを管理し、保留中のイベントをキューに入れ、コールバックを呼び出します。

libev / libeventをPythonの対応物と比較したい場合は、それらをtwistedのreactorおよびtornadoのIOLoopと比較する必要があります。

libevのドキュメントから:

ev_runが行うことの厄介な詳細は次のとおりです(これはあなたの理解のためであり、将来のバージョンでこれとまったく同じように機能することを保証するものではありません):

   - Increment loop depth.
   - Reset the ev_break status.
   - Before the first iteration, call any pending watchers.
   LOOP:
   - If EVFLAG_FORKCHECK was used, check for a fork.
   - If a fork was detected (by any means), queue and call all fork watchers.
   - Queue and call all prepare watchers.
   - If ev_break was called, goto FINISH.
   - If we have been forked, detach and recreate the kernel state
     as to not disturb the other process.
   - Update the kernel state with all outstanding changes.
   - Update the "event loop time" (ev_now ()).
   - Calculate for how long to sleep or block, if at all
     (active idle watchers, EVRUN_NOWAIT or not having
     any active watchers at all will result in not sleeping).
   - Sleep if the I/O and timer collect interval say so.
   - Increment loop iteration counter.
   - Block the process, waiting for any events.
   - Queue all outstanding I/O (fd) events.
   - Update the "event loop time" (ev_now ()), and do time jump adjustments.
   - Queue all expired timers.
   - Queue all expired periodics.
   - Queue all idle watchers with priority higher than that of pending events.
   - Queue all check watchers.
   - Call all queued watchers in reverse order (i.e. check watchers first).
     Signals and child watchers are implemented as I/O watchers, and will
     be handled here by queueing them when their watcher gets executed.
   - If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT
     were used, or there are no active watchers, goto FINISH, otherwise
     continue with step LOOP.
   FINISH:
   - Reset the ev_break status iff it was EVBREAK_ONE.
   - Decrement the loop depth.
   - Return.
于 2012-05-17T23:17:47.917 に答える