【问题标题】:How is twisted's Deferred implemented?twisted 的 Deferred 是如何实现的?
【发布时间】:2012-05-15 15:58:27
【问题描述】:

它会在下面产生一个新线程吗?如果经典 Web 服务器生成一个线程来服务 HTTP 请求并且使用 Twisted web 我必须在每次我想查询 mysql 时生成一个 Deferred() - 增益在哪里?如果它产生一个线程似乎没有意义,那么它是如何实现的?

【问题讨论】:

  • 你看过源码了吗?
  • 如果你真正想要的是了解 AIO,这是一个更大的问题,而不是真正关于 Deferred(或 Twisted,甚至 Python)的问题。虽然有更新的方法,但您可以从阅读 select() 调用和 O_NONBLOCK 标志开始。

标签: python asynchronous twisted twisted.web


【解决方案1】:

正如其他人所说,Deferred 本身只是对价值的承诺,以及价值到达时(或获取价值失败时)要做的事情的列表。

它们的工作原理是这样的:某个函数看到它想要返回的值还没有准备好。因此,它准备了一个 Deferred,然后以某种方式安排该 Deferred 在准备好后被回调(“解雇”)和值。第二部分可能会引起您的困惑; Deferred 本身无法控制何时或如何被解雇。这是创建 Deferred 的任何人的责任。

在整个 Twisted 应用程序的上下文中,几乎所有内容都是基于事件的,并且事件由反应器管理。假设您的代码使用了twisted.web.client.getPage(),所以它现在有一个 Deferred,它将与 http 获取的结果一起被触发。这意味着getPage() 启动了与 http 服务器的 tcp 对话,并且实质上在反应器中安装了处理程序,说“如果您在此 tcp 连接上看到任何流量,请在此协议对象上调用一个方法”。一旦 Protocol 对象看到它收到了您请求的整个页面,它就会触发您的 Deferred,然后通过该 Deferred 的回调链调用您自己的代码。

所以一切都是回调和钩子,一直向下。这就是为什么你永远不应该在 Twisted 应用程序中使用阻塞代码,除非在单独的线程上——因为它也会阻止其他所有内容的处理。

这有帮助吗?

【讨论】:

    【解决方案2】:

    Python 中的Deferred 没有任何作用,它与线程、进程或其他任何东西都没有任何关系。

    它是一个promise的抽象,用于传递未来的数据以及该数据如何映射到接收回调函数。

    This is documented very well.

    如何 Twisted 实现异步行为在 Twisted 文档和新闻组档案中有很好的记录,简单的 Google 搜索将找到您需要的内容。它与 Deferred 的实现无关。如果您仍然不明白,您需要在另一个问题中询问具体信息,而不是在对此答案的评论中。

    也就是说,就并发性而言,Twisted 已经死了,它永远不会扩展到多核处理器以及像 Erlang 这样的东西,当 Twisted 不再为我扩展时,我从 Twisted 转移到了这种东西。

    【讨论】:

    • 抱歉,我的问题不准确。我的意思是:非阻塞的东西是如何实现的——例如——我使用twisted.enterprise.adbapi或其他数据库(cassandra、memcache等)的其他接口查询MySQL。代码执行没有被阻塞,同时它连接到数据库并运行查询。所以我想知道下面的实现是否会创建一个新线程?
    • @JarrodRoberson 这不是问题的真正主题,但您对 Twisted 缩放不太正确。随着 PyPy 对 STM 的持续实现,应该可以制作一个支持 STM 的反应器,它实际上将并行处理多个回调链。
    • 我们在运行 CPython,这是 7 年前的事了。那时谁会在每天负责数亿笔交易的企业生产系统中运行 PyPy?还是现在?根据他们在事务性内存捐赠页面上的文档,PyPY 仍然有一个 GIL。 “GIL 或全局解释器锁是 CPython 和(到目前为止)PyPy 中的单个锁,所有线程都必须获取它才能执行 Python 字节码。这意味着到目前为止,在 Python 中,即使使用线程我们在多核性能方面没有任何好处。” 所以我现在是正确的。
    • 我不是在谈论 7 年前。我正在回复你现在已删除的评论,其中说“Twisted 永远不会扩展到多核处理器”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2010-10-08
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多