Python - 等待来自多个套接字的输入

3

我正在使用Python进行一个简单的实验。我有一个“主”进程,负责所有其他进程,并且每个单独的进程都通过Unix套接字连接到主进程。我希望主进程能够监视所有套接字以获取响应,但理论上可能会有近百个这样的套接字。线程如何影响应用程序的内存和性能?最佳解决方案是什么?非常感谢!

2个回答

5
一百个同时线程可能已经达到了线程的合理极限。如果您发现这是组织代码最清晰的方式,我建议尝试一下,但是线程确实不能很好地扩展。
更好的方法是使用像select这样的技术来等待其中一个套接字可读/可写/或者有错误要报告。这种机制可以让您睡眠直到发生有趣的事情,处理尽可能多的套接字内容,然后再次回到睡眠状态,所有这些都在单个执行线程中完成。去掉多线程通常可以减少错误的机会,而这种编程风格应该可以让您轻松地处理数百个连接。(如果要超过约100个连接,我建议使用poll功能而不是select - 不断重建有趣文件描述符列表需要时间,而poll不需要。)

需要考虑的是Python Twisted Framework。他们花费了一定的力气为这种编程提供了一种一致的方法来将回调挂钩到事件上。(如果您熟悉node.js,它有点像那样,但是使用Python。)我必须承认对Twisted有些厌恶——我在他们的文档中没有取得太大进展而感到非常困惑——但是许多人比我在文档中走得更远。您可能会发现它比我更适合。


谢谢,我会研究一下。但是在较少数量的套接字上使用轮询的原因是什么? - Travis
不,poll 对于较少的套接字也能很好地工作。我认为 select 接口比 poll 接口稍微容易一些,但它们非常接近。 - sarnold
epoll 绝对使得在事件处理循环的任何迭代中使用套接字上的 部分读取 更加容易。 (selectpoll 需要你 记住 你已经进行了部分读取 -- 或者从未执行部分读取。) - sarnold

1

进行线程与进程的套接字处理比较测试的最简单方法是使用Python标准库中的SocketServer。您可以通过继承ThreadingMixInForkingMixIn之一来轻松切换方法(同时保持其他所有内容不变)。以下是一个简单示例,可帮助您入门。

另一种选择是使用单个进程和单个线程中的非阻塞套接字的select/poll方法

如果您对已经完全开发和高度发展的软件感兴趣,请考虑这些高性能Python服务器包:

  • Twisted框架使用异步单进程、单线程风格。
  • Tornado框架类似(不太成熟,功能不够完善,但更易于理解)。
  • Gunicorn则是高性能的分叉服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接