【问题标题】:epool with pyev or select from stdlib in Python?使用 pyev 的 epool 或从 Python 中的 stdlib 中选择?
【发布时间】:2012-05-17 21:29:02
【问题描述】:

是否有人在 Python 中通过 Python stdlib 中的select 衡量了 pyev 相对于标准绑定的速度和实用性?

使用 pyev 比 select 有什么好处?

pyev 是由 C 扩展构建的,因此它不是可移植的解决方案。我尝试使用 PyPy 构建它,但开箱即用并没有成功。
所以我只是想知道它是否值得使用。

我知道 gevent 在它的 1.0 版本中使用 libev(在他们使用 libevent 之前)。他们真的需要吗? 我不关心非事件循环功能(比如来自 libevent 的 dns)。

【问题讨论】:

    标签: python gevent libevent libev


    【解决方案1】:

    Python 的 select 模块只是 select()、poll() 和 epoll() 系统调用的包装,而 libev 和 libevent 实现了一个事件循环。事件循环管理观察者和计时器,将未决事件排队,调用您的回调等。

    如果要将 libev/libevent 与 Python 对应项进行比较,则需要将它们与 twisted 的 reactor 和 tornado 的 IOLoop 进行比较。

    来自libev documentation

    这里是 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多