Python - 等待来自大量套接字的输入

时间:2011-11-22 04:25:51

标签: python sockets

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

2 个答案:

答案 0 :(得分:5)

一百个同步线程可能会推动线程的合理限制。如果您发现这是组织代码的最简洁方法,我会说尝试一下,但线程确实不能扩展到很远。

更好的方法是使用像select之类的技术来等待其中一个套接字可读/可/或报告错误。这个机制让你进入睡眠状态,直到有趣的事情发生,处理尽可能多的套接字有内容要处理,然后再次回到睡眠状态,所有这些都在一个执行线程中。删除多线程通常可以减少出错的机会,而这种编程风格应该可以让您轻松进入数百个连接。 (如果你想要超过100,我会使用poll功能而不是select - 不断重建有趣的文件描述符列表需要poll不需要的时间。 )

需要考虑的是Python Twisted Framework。他们已经花了一些长度来提供一种一致的方法来将回调挂钩到事件上以进行这种精确的编程。 (如果你熟悉node.js,它有点像那样,但是Python。)我必须承认对Twisted的轻微厌恶 - 我从来没有在他们的文档中走得太远而没有完全被困惑 - 但是{{ 3}}。你可能会发现它比我更合适。

答案 1 :(得分:1)

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

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

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

  • Twisted框架使用异步单进程,单线程样式。
  • Tornado框架类似(演变程度较低,功能较少,但更易于理解)
  • Gunicorn这是一个高性能的分叉服务器。