我刚开始用Python学习套接字。所以我写了一些聊天服务器和客户端的例子。我在互联网上看到的大部分内容似乎都使用线程模块来处理客户端与服务器的连接(异步)。我确实理解,对于可伸缩服务器,你需要使用一些额外的技巧,因为成千上万的线程可以杀死服务器(如果我错了,请纠正我,但这是由于GIL吗?),但这不是我现在关注的问题。
奇怪的是,我在Python文档中找到了创建子进程的正确方法(不幸的是我丢失了引用,对不起:()来处理套接字。
所以问题是:使用线程或多处理?还是有更好的解决方案?
请给我答案并向我解释不同之处。
顺便说一下:我知道有很多像Twisted这样写得很好的东西。 我不是在寻找预先制作的可扩展服务器,而是试图了解如何编写可以扩展的服务器或者至少可以处理10k个客户端。
编辑:操作系统是Linux。
答案 0 :(得分:11)
尝试不同方法的简单方法是从标准库中的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/
祝你好运和快乐的计算: - )
答案 1 :(得分:0)
数以千计的线程可以杀死服务器(如果我错了,请纠正我,但这是由于GIL吗?)
首先,GIL与no无关。线程。如果您正在这些线程中执行IO,那么您可以拥有数十万个这样的线程,而不会出现GIL或其他任何问题。
当你有CPU密集型任务时,GIL会发挥作用。
See this very informative talk from David Beazly了解有关GIL的更多信息。