gpt4 book ai didi

python - twisted的Deferred是如何实现的?

转载 作者:行者123 更新时间:2023-11-28 22:02:50 28 4
gpt4 key购买 nike

它会在下面产生一个新线程吗?如果经典 Web 服务器生成一个线程来处理 HTTP 请求,而使用 Twisted Web,我每次想查询 mysql 时都必须生成一个 Deferred() - yield 在哪里?看起来如果它产生一个线程就没有意义,那么它是如何实现的?

最佳答案

正如其他人所说,Deferred 本身只是一个值的 promise ,以及值到达时(或获取值失败时)要做的事情的列表.

它们的工作原理是这样的:一些函数发现它想要返回的值还没有准备好。因此它准备一个 Deferred,然后以某种方式安排 Deferred 在准备就绪后用值回调(“解雇”)。第二部分可能会引起您的困惑; Deferreds 本身并不能控制它们何时以及如何被解雇。这是创建延迟对象的责任。

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

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

这有帮助吗?

关于python - twisted的Deferred是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10604523/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com