Python asyncore: "文件描述符在select()中超出范围

1 投票
1 回答
2310 浏览
提问于 2025-04-17 05:34

我有一个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) 的支持是可以工作的——也就是说,它可以在简单的情况下提供读、写和关闭的通知。你的情况和简单情况有什么不同呢?

撰写回答