【问题标题】:How can 'one' IOLoop handle 10k connections?“一个” IOLoop 如何处理 10k 连接?
【发布时间】:2012-11-20 00:48:18
【问题描述】:

很抱歉这个愚蠢的问题,但我真的很困惑;我希望你能纠正我哪里错了。

基于线程的服务器(如 Apache)中,我知道对于每个客户端,都会为他创建一个新的“工作人员”来满足他的所有需求。

事件驱动(如 Nginx 和 Tornado)中,这让我感到困惑,尤其是在 Python 的 GIL 之类的 Not Thread Safe强>;据我了解,有一个单循环可以处理所有客户端请求,所以我的愚蠢理解是,如果有 10 000 个同时连接,我不知道如何为所有这 10 个请求提供服务!

【问题讨论】:

    标签: asynchronous nginx tornado event-driven


    【解决方案1】:

    在事件驱动的服务器中,您只需使用非阻塞调用一个接一个地处理连接(实际上是来自特定连接的read()s 和write()s)。您通常会在连接之间使用一些调用来进行多路复用(select()poll()、...),它会告诉您哪些连接需要服务,然后您依次为它们服务。

    【讨论】:

    • 那么为什么我们不能在事件驱动和基于线程的服务器之间进行结合呢?
    • 你可以。例如:每个 CPU 核心可能有一个线程,其中每个线程都是事件驱动的。您可能还有工作线程来处理动态页面生成(PHP、JSP、...),并通过“正常”事件驱动线程提供静态内容(图像、...)。
    • 问题是 Python (CPytohn) 有 GIL,正如所说的 Tornado 处理 10k 连接,所以我很“震惊”这可能发生!如果发生 10k 的同时连接,那么,如果一个操作有 1 秒,则 il 将被拆分为 1/10k ?
    • 视情况而定。 Tornado 可能可以处理 10k/s 的典型连接,但仍然存在物理限制:如果您没有带宽,您将无法处理要求下载大文件的 10k 连接。在这种情况下,在为每个连接提供服务时,理想的情况是您的服务器只发送(注意:当场制定的公式)(带宽*期望的最大延迟/活动连接数)每次迭代。
    • 在这种情况下,它将是您的出站带宽,这可能远低于此。繁忙的服务器应该有更多的带宽。
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多