扭曲的延迟如何实施?

时间:2012-05-15 15:58:28

标签: python asynchronous twisted twisted.web

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

2 个答案:

答案 0 :(得分:3)

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

它们是如何工作的:某些函数看到它想要返回的值还没有准备好。所以它准备一个Deferred,然后以某种方式安排延迟为回调(“解雇”)一旦它准备好了。第二部分可能会引起你的困惑;他们自己的延迟不能控制何时或如何被解雇。这是任何创造延期的责任。

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

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

这有帮助吗?

答案 1 :(得分:2)

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

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

This is documented very well.

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

也就是说,Twisted在并发性方面有点死,它永远不会扩展到多核处理器以及类似Erlang的东西,这就是我从Twisted中转移到Twisted时为我退出扩展。