twisted的延迟是如何实现的?

2024-04-29 05:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

它会在下面产生一个新的线程吗?如果经典的web服务器生成一个线程来服务HTTP请求,而对于Twisted web,每次我想查询mysql时都必须生成一个Deferred()——这有什么好处?如果它产生了一个线程,它看起来就不会成为sens,那么它是如何实现的呢?在


Tags: 服务器webhttpmysqltwisted线程经典sens
2条回答

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

它们的工作原理是这样的:一些函数看到它想要返回的值还没有准备好。所以它准备了一个Deferred,然后在它准备好之后,以某种方式安排延迟的回调(“fired”)。第二部分是可能导致你困惑的原因;推迟本身并不能控制他们何时或如何被解雇。这是造成延期的原因。在

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

所有的方法都是回调。这就是为什么你不应该在Twisted应用程序中使用阻塞代码,除非是在一个单独的线程上——因为它也会阻止其他所有事情的处理。在

这有帮助吗?在

Python中的Deferred不做任何事情,它与线程、进程或其他任何事情无关。在

它是一个承诺的抽象,用于将来要传递的数据以及如何将数据映射到接收回调函数。在

This is documented very well.

如何Twisted实现异步行为在Twisted文档和新闻组档案中有很好的记录,简单的Google搜索就能找到你需要的东西。它与延迟执行无关。如果你仍然不明白,你需要在另一个问题中问这个问题来获得具体信息,而不是在对这个答案的评论中。在

这就是说,Twisted在并发性方面已经死了,它永远不会扩展到多核处理器以及像Erlang这样的处理器,这是Twisted退出扩展时从Twisted转移到的。在

相关问题 更多 >