Python asyncore: "文件描述符在select()中超出范围
我有一个Python脚本,它使用asyncore库,建立了超过3000个外发的socket连接。因为连接数量的限制(最多只能有1024个),我不能使用select(..)这个方法,但poll(..)也没有正常工作:
asyncore.loop(use_poll=True)
使用这个方法调用后,我的应用程序忽略了所有的socket事件。需要注意的是,当socket数量少于1024时,select()是可以正常工作的。
我的问题出在哪里呢?
1 个回答
0
首先,有一点小纠正。use_poll=True
并不会让 asyncore
使用 epoll(2),而是让它使用 poll(2)。而且,由于 asyncore
的工作方式,实际上没有太多理由去使用 epoll(2),因为在 Python 层面上,asyncore
的开销已经超过了使用套接字事件通知 API 的任何成本。
其次,asyncore
的一个主要缺点是它让你暴露在一些特定平台的怪癖中。如果你想要一个能更好地处理 select(2) 和 poll(2) 之间差异的库,并且实际上支持 epoll(2),而且在很多其他方面也更优秀,可以看看 Twisted。
如果你能 提供更多细节,也许可以找到你在使用 asyncore
时遇到的具体问题,但根据现在的信息,无法确定具体情况。asyncore
的基本功能,比如 poll(2) 的支持是可以工作的——也就是说,它可以在简单的情况下提供读、写和关闭的通知。你的情况和简单情况有什么不同呢?