我正在使用Python进行一个简单的实验。我有一个“主”进程,负责所有其他进程,并且每个单独的进程都通过Unix套接字连接到主进程。我希望主进程能够监视所有套接字以获取响应,但理论上可能会有近百个这样的套接字。线程如何影响应用程序的内存和性能?最佳解决方案是什么?非常感谢!
select
这样的技术来等待其中一个套接字可读/可写/或者有错误要报告。这种机制可以让您睡眠直到发生有趣的事情,处理尽可能多的套接字内容,然后再次回到睡眠状态,所有这些都在单个执行线程中完成。去掉多线程通常可以减少错误的机会,而这种编程风格应该可以让您轻松地处理数百个连接。(如果要超过约100个连接,我建议使用poll
功能而不是select
- 不断重建有趣文件描述符列表需要时间,而poll
不需要。)
需要考虑的是Python Twisted Framework。他们花费了一定的力气为这种编程提供了一种一致的方法来将回调挂钩到事件上。(如果您熟悉node.js
,它有点像那样,但是使用Python。)我必须承认对Twisted有些厌恶——我在他们的文档中没有取得太大进展而感到非常困惑——但是许多人比我在文档中走得更远。您可能会发现它比我更适合。
进行线程与进程的套接字处理比较测试的最简单方法是使用Python标准库中的SocketServer。您可以通过继承ThreadingMixIn或ForkingMixIn之一来轻松切换方法(同时保持其他所有内容不变)。以下是一个简单示例,可帮助您入门。
另一种选择是使用单个进程和单个线程中的非阻塞套接字的select/poll方法。
如果您对已经完全开发和高度发展的软件感兴趣,请考虑这些高性能Python服务器包:
poll
对于较少的套接字也能很好地工作。我认为select
接口比poll
接口稍微容易一些,但它们非常接近。 - sarnoldepoll
绝对使得在事件处理循环的任何迭代中使用套接字上的 部分读取 更加容易。 (select
和poll
需要你 记住 你已经进行了部分读取 -- 或者从未执行部分读取。) - sarnold