【问题标题】:Python: Lib to use epoll if available, fallback to selectPython:如果可用,使用 epoll 的 Lib,回退到选择
【发布时间】:2018-06-20 13:35:33
【问题描述】:

我想在我的 Python 库中使用 select.epoll()

不幸的是,epoll 并非无处不在。

我需要一种回退到 select.select() 的方法。

我试图在 pypi 上找东西,但找不到匹配的包:https://pypi.python.org/pypi?%3Aaction=search&term=epoll&submit=search

我该如何解决这个“如果 epoll 不可用则从 epoll 回退到 select”?

【问题讨论】:

  • 如何使用 libevent 来包装所有这些 libevent.org
  • @AkhilThayyil 如果您将评论写为答案,那么我会支持它。 libevent 的东西看起来不错。
  • @internety 感谢您在现阶段提供指向“epoll 已彻底损坏”的链接。本文关注的问题不适用于我对 epoll 的使用,但很高兴知道。

标签: python select python-asyncio epoll


【解决方案1】:

Python 3.4 引入了selectors module。它提供了一个DefaultSelector,它是“当前平台上最有效的实现”的别名。

这是一个简单的用法示例:

sel = selectors.DefaultSelector()

sel.register(fp1, selectors.EVENT_READ)
sel.register(fp2, selectors.EVENT_READ)
sel.register(fp3, selectors.EVENT_READ)

for key, mask in sel.select():
    print(key.fileobj)

您可以找到更多complete example on the Python documentation

DefaultSelector 将按以下顺序尝试:

  • epool (Linux)、kqueue (FreeBSD / NetBSD / OpenBSD / OS X) 或 /dev/poll (Solaris)
  • poll (Unix)
  • select

【讨论】:

    【解决方案2】:

    除了selectors stdlib,我会选择uvloop,它是在 Cython 的 libuv 之上构建的。相比libevent/libev,这两个没有主动维护python绑定,uvloop更有希望。

    【讨论】:

      【解决方案3】:

      如何使用包含所有轮询机制的 libevent,并根据您的平台退回到可用的最佳机制libevent.org

      【讨论】:

      【解决方案4】:

      这是我的两分钱。根据documentation 的说法,epoll 仅在 Linux 2.5.44 及更高版本上可用。附代码:

      import os
      if os.uname()[0] != 'Linux' or os.uname()[2] < '2.5.44':
          #use select
      else:
          #use epoll
      

      更好的是,我认为上面可以变成一个很好的装饰器,可以在程序中的任何地方使用,它根据底层操作系统返回正确的函数。

      【讨论】:

        最近更新 更多