Python可扩展聊天服务器

10

我刚开始学习使用Python的sockets。因此,我编写了一些聊天服务器和客户端的示例。在互联网上看到的大部分内容似乎都使用了线程模块来(异步)处理客户端连接到服务器的情况。我确实明白,为了获得可扩展的服务器,您需要使用一些额外的技巧,因为数千个线程可能会使服务器崩溃(如果我错了,请纠正我,这是由于GIL吗?),但这不是我目前关心的问题。

奇怪的是,我在Python文档中发现创建子进程是处理套接字的正确方式(不幸的是,我找不到参考文献,抱歉 :( )。

那么问题是:使用线程还是使用多进程?或者有更好的解决方案吗?

请给我答案并向我解释其中的区别。

顺便说一句:我知道有像Twisted这样写得很好的东西。我不想要预先制作的可扩展服务器,而是试图理解如何编写一个可以缩放或至少处理10k个客户端的服务器。

编辑:操作系统是Linux。


1
你有没有尝试查看Twisted的源代码? - Ben James
@Ben James:显然,如果有人向我解释,那比我浏览成千上万行的代码要容易得多,而且我可能甚至不理解。 :) 这就是 stackoverflow 的用途,对吧? - freakish
不幸的是,我担心答案在很大程度上取决于您正在运行的操作系统。对于基于Unix的系统,子进程可能是最好的选择,而对于Windows系统,异步I/O是标准... - Adrien Plisson
@Adrien Plisson:抱歉,忘记写了。它是Linux(我已经编辑了问题)。 - freakish
2个回答

11

Facebook需要一个可扩展的服务器,因此他们编写了Tornado(它使用异步)。Twisted也以其可扩展性而闻名(它也使用异步)。Gunicorn也是一个顶尖表现者(它使用多个进程)。我知道的快速、可扩展工具中没有一个使用线程。

尝试不同的方法的简单方法是从标准库中的SocketServer模块开始:http://docs.python.org/library/socketserver.html。它允许您通过交替继承ThreadingMixin或ForkingMixin来轻松地切换方法。

此外,如果您有兴趣学习异步方法,建立理解最简单的方法是阅读一篇关于Tornado实现的博客文章:http://golubenco.org/2009/09/19/understanding-the-code-inside-tornado-the-asynchronous-web-server-powering-friendfeed/

祝你好运并享受编程 :-)


这不是应该用FriendFeed而不是Facebook吗? - Jesvin Jose
1
无价之宝!非常感谢! - kta

0
成千上万的线程可能会导致服务器崩溃(如果我说错了,请纠正我,这是由于GIL吗?)
首先,GIL与线程数量无关。如果在这些线程中进行IO操作,即使有数十万个线程也不会受到GIL或其他方面的任何问题的影响。
只有在进行CPU密集型任务时,GIL才会发挥作用。
点击这里查看David Beazly的非常有信息量的演讲以了解更多关于GIL的知识。

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