【问题标题】:Python scalable chat serverPython 可扩展聊天服务器
【发布时间】:2011-10-21 08:51:23
【问题描述】:

我刚刚开始使用 Python 学习套接字。所以我写了一些聊天服务器和客户端的例子。我在互联网上看到的大部分内容似乎都使用线程模块来(异步)处理客户端与服务器的连接。我确实明白,对于可扩展的服务器,您需要使用一些额外的技巧,因为成千上万的线程可以杀死服务器(如果我错了,请纠正我,但这是由于 GIL 造成的吗?),但这不是我目前关心的问题。

奇怪的是,我在 Python 文档的某处发现创建子进程是正确的方法(不幸的是,我丢失了参考,抱歉 :( )用于处理套接字。

所以问题是:使用线程还是多处理?还是有更好的解决方案?

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

顺便说一句:我知道有些东西像 Twisted 写得很好。 我不是在寻找预制的可扩展服务器,而是试图了解如何编写一个可以扩展或处理至少 10k 客户端的服务器。

编辑:操作系统是 Linux。

【问题讨论】:

  • 你试过查看 Twisted 的来源吗?
  • @Ben James:显然,如果有人向我解释它而不是阅读我什至可能无法理解的数千行代码,这会更容易。 :) 这就是 stackoverflow 的用途,对吧?
  • 不幸的是,我担心答案很大程度上取决于您运行的操作系统。当异步 i/o 是 Windows 系统的标准时,子进程可能是基于 unix 的系统的最佳选择......
  • @Adrien Plisson:抱歉,忘记写了。它是 Linux(我已经编辑了问题)。

标签: python multiprocessing scalable


【解决方案1】:

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?
  • 无价之宝!非常感谢!
【解决方案2】:

数千个线程可以杀死服务器(如果我错了,请纠正我,但这是由于 GIL 造成的吗?)

一方面,GIL 与否无关。线程。如果您在这些线程中执行 IO,那么您可以拥有数十万个这样的线程,而不会出现 GIL 或其他方面的任何问题。

当您有 CPU 密集型任务时,GIL 就会发挥作用。

See this very informative talk from David Beazly 了解有关 GIL 的更多信息。

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多