龙卷风 ioloop 和龙卷风的工作流程是什么?

2023-12-29

我想了解tornado的内部工作流程,并且已经看到本文 http://golubenco.org/?p=16,这很棒,但我就是不明白

在ioloop.py中,有这样一个函数

def add_handler(self, fd, handler, events):
    """Registers the given handler to receive the given events for fd."""
    self._handlers[fd] = handler
    self._impl.register(fd, events | self.ERROR)

那么这是什么意思呢?每个请求都会触发add_handler还是在init时只触发一次?

每个套接字连接都会生成一个文件描述符,或者只生成一次?

ioloop 和 iostream 之间有什么关系?

httpserver 如何与 ioloop 和 iostream 一起使用?

有没有工作流程图,方便我看清楚?

抱歉这些问题,我只是很困惑

任何链接、建议、提示都有帮助。非常感谢 :)


我看看能否按顺序回答你的问题:

  • Here _impl是可用的套接字轮询机制,epoll在Linux上,select在 Windows 上。所以self._impl.register(fd, events | self.ERROR)将“等待某些事件”请求传递给底层操作系统,还特别包括错误事件。

    运行时,HTTPServer将注册套接字以接受连接,使用IOLoop.add_handler()。当连接被接受时,它们将生成更多的通信套接字,这也可能通过以下方式添加事件处理程序:IOStream,也可以调用add_handler()。因此,新的处理程序将在开始时和收到连接时添加。

  • 是的,每个新的套接字连接都会有一个唯一的文件描述符。原来的插座HTTPServer正在监听的应该保留其文件描述符。文件描述符由操作系统提供。

  • The IOLoop处理与套接字有关的事件,例如是否有数据可供读取、是否可以写入以及是否发生错误。通过使用操作系统服务,例如epoll or select,它可以非常有效地做到这一点。

    An IOStream通过单个连接处理流数据,并使用IOLoop异步执行此操作。例如一个IOStream可以读取尽可能多的可用数据,然后使用IOLoop.add_handler()等待更多数据可用。

  • On listen(), the HTTPServer创建一个套接字,用于监听连接IOLoop。当获得连接时,它使用socket.accept()创建一个新的套接字,然后使用新的套接字与客户端进行通信HTTPConnection.

    The HTTPConnection使用一个IOStream向客户端传输数据或从客户端传输数据。这IOStream使用IOLoop以异步和非阻塞的方式做到这一点。许多IOStream and HTTPConnection对象可以同时处于活动状态,所有对象都使用相同的IOLoop.

我希望这能回答您的一些问题。我不知道有什么好的结构图,但其他网络服务器的总体思路也应该非常相似,所以可能有一些好的信息。您链接到的那篇深入文章看起来确实非常有用,所以如果您足够理解,我建议您再试一次:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

龙卷风 ioloop 和龙卷风的工作流程是什么? 的相关文章

随机推荐

  • 放弃 Git Stash Pop

    我做了一个 git stash pop 现在有很多冲突 我在之前提交了所有最近的代码git stash pop 那么有没有办法返回到最后一次提交并消除所有冲突并编码git stash pop注射 这个问题已经在 stackoverflow
  • 如何从会话中检索通用列表?

    我在会议中列出了一份清单 Session Add SessionList mylist 如何从会话中检索它 var list Session SessionList as List
  • Appengine 过滤不等式和排序失败

    我认为我在这里忽略了一些简单的事情 我无法想象这是不可能做到的 我想按日期时间属性进行过滤 然后按排名整数属性对结果进行排序 当我尝试这样做时 query filter submitted gt thisweek order ranking
  • 从 JSON 到 NSArray

    我正在使用此处找到的 JSON 框架 http stig github com json framework http stig github com json framework在我的 iPhone 应用程序中 我正在尝试将一些数据解析为
  • 这是 Ruby 中 Array.fill 方法的错误吗? [复制]

    这个问题在这里已经有答案了 应该是这种情况 即我误解了 还是一个错误 a Array new 3 Array new 3 a 1 fill g gt g g g g g g g g g 不应该导致 gt nil nil nil g g g
  • 批处理文件从txt文件中删除前18个字符

    我有一个 txt 文档 其中包含超过 32 000 行带注释的机器代码 它看起来像这样 Display menu window C0 000E E220 SEP 20 C0 0010 C210 REP 10 C0 0012 20640B J
  • HostnameVerifier 接口的不安全实现 - Android

    Play 商店应用被拒绝的原因 您的应用程序正在使用 HostnameVerifier 接口的不安全实现 您可以在此找到有关如何解决该问题的更多信息Google 帮助中心文章 https support google com faqs an
  • grep 查找中间带有通配符的文本

    我想 grep 类似的东西 gt sh lt 但这不起作用 我可以 grep 一切 sh lt 但无法让通配符发挥作用 这里有什么技巧呢 你需要 grep 类似的东西 gt sh lt The 部分匹配任何长度的任何字符 部分匹配一个点
  • gwt 自定义小部件包装方法

    我的自定义小部件如下所示 public class CustomWidget extends Composite public static CustomWidget wrap com google gwt dom client Eleme
  • 如何将 Lua 函数传递给 C 函数并多次执行 Lua 函数?

    我想要做的是创建一个函数 它将迭代一些对象并为每个函数调用一个函数 我使用的是 BlitzMax 而不是 C 但这不是重点 因为它具有 Lua 的 C 函数的完整包装 Lua有一个lua pushcfunction 命令 但是lua pus
  • Python3 + Curses:如何按“q”立即结束程序?

    当我运行以下示例代码并按 q 时 它会正常结束 但是如果我按任何其他字符 例如许多中断和许多其他字符 然后按 q 它不会退出 我该如何解决这个问题 import curses time def main sc sc nodelay 1 wh
  • 如何检查变量是否是数组?...或类似数组的东西

    我想用一个foreach用一个变量循环 但这个变量可以有很多不同的类型 NULL例如 所以之前foreach我测试一下 if is array var foreach var as 但我意识到它也可以是一个实现的类Iterator界面 也许
  • 如何加载(或映射)文件部分最大大小,但适合 Windows 上的 RAM?

    有大文件 我需要快速排序 我将按适合 RAM 的部分处理文件 以避免 程度使用页面文件 下一步 合并部分 如何使用最大内存 我的解决方案 使用WinApi文件内存映射 但我不知道如何获取文件最大大小的一部分 但适合RAM 如何确定大小 Yo
  • Service-Fabric 绑定到多个端点

    是否可以绑定服务结构应用程序来侦听多个端口 基本上 我试图拥有一个面向公众的服务 它侦听 http 80 和 https 443 并将任何 http 请求重定向到 https 我创建了一个新的 ASP net Core 服务 它单独工作正常
  • F# 联合类型列表

    我想要一份报告清单 报告可以是详细信息或部分类型 module Data type Section Header string Lines string list Total string type Detail State string
  • jQuery 复选框

    我正在尝试编写一段 jQuery 代码 如果所有复选框都 未选中 则所有 li 标签的类都为 disabled 但是 如果选中一个复选框 任何复选框 则所有 li 标签都会失去 disabled 类别 非常感谢 checkbox click
  • 如何将字符串复制到剪贴板

    在xcode中如何将文本复制到剪贴板 目前 我正在使用以下代码 UIPasteboard pasteboard UIPasteboard generalPasteboard pasteboard setString shareString
  • 使用base64编码生成Oauth授权令牌

    我正在尝试按照指南为 YAHOO DSP API 生成 Oauth 身份验证令牌 Base64 编码是一种将二进制数据编码为文本的方法 以便可以轻松地在网络上传输而不会出现错误 在此步骤中 您将获取 YDN 控制台为您生成的客户端 ID 和
  • 是否可以将 AWS CodePipeline 与 Lightsail 结合使用?

    我工作了一整天却找不到答案 所以我问你们 是否可以将 AWS Pipeline 与 AWS Lightsail 结合使用 我的目标是将代码存储在 CodeCommit 中 并使用 CodeBuild CodeDeploy CodePipel
  • 龙卷风 ioloop 和龙卷风的工作流程是什么?

    我想了解tornado的内部工作流程 并且已经看到本文 http golubenco org p 16 这很棒 但我就是不明白 在ioloop py中 有这样一个函数 def add handler self fd handler even