我有一些python脚本,基于asyncore lib,有超过3k个输出套接字连接。
由于连接数限制(1024),我无法使用select(..),但poll(..)也无法正常工作:
asyncore.loop(use_poll=True)
使用此调用,我的应用程序将忽略任何套接字事件。注意,小于1024个套接字上的select()可以正常工作。
我的问题在哪里?
最佳答案
首先,一个小小的修正。use_poll=True
不会导致asyncore
使用epoll(2)。它导致它使用poll(2)(此外,asyncore的工作方式,没有什么理由尝试使用epoll(2),因为asyncore的python级开销超过了使用socket事件通知api的任何成本)。
其次,asyncore
的一个主要缺点是它使您暴露于特定于平台的怪癖的程度。对于一个为您处理select(2)和poll(2)之间更多差异的库,如果它实际上支持epoll(2),并且是better in a number of other ways too,请签出Twisted。
如果您可以对您的问题add more details,那么您在asyncore上遇到的特定问题可能会被发现,但是基于现在可用的信息,无法确定。asyncore的poll(2)的基本特性支持工作,即,它可以在很小的情况下传递读、写和关闭通知。你的案子和普通案子有何不同?