Python扭曲的Reactor类

时间:2010-03-12 15:11:52

标签: python twisted

装饰者的意义是什么

 @reactor.callWhenRunning,
 @results_deferred.addCallback
 @results_deferred.addErrback.

还有什么是延迟字符串,例如在

 twisted.internet.utils.getProcessOutput()

返回一个延迟字符串,这里到底发生了什么?

我是新来的扭曲因此这可能是一个非常简单的问题,但阅读扭曲的文档并没有帮助我

3 个答案:

答案 0 :(得分:4)

在正常的编程实践中你会做

db = Database.connect()
result = db.getResult()
processResult(result)

现在,根据您的数据库和网络,这3个语句可能需要从毫秒到几秒。

我们几十年来都在用这种方式进行编程,而且大多数情况下我们都可以“等待”。

但有一段时间你的程序不能等待结果。你会开始思考,在等待结果的时候,我可以做很多其他事情。也许打印输出,或处理函数,或者只是快速检查套接字等。

输入Twisted和Deferred。

而不是等待result,在Twisted中调用特殊方法时,您将获得Deferred。你将为这个延迟添加一个回调函数,这意味着,当你得到结果/答案时调用这个函数。

deferredResult = db.nonBlockingGetResult()
deferredResult.addCallback(processOutput)

一旦执行第一个语句,它就会返回'something'。那件事是Deferred。那里没有阻挡,没有等待。对于此Deferred,您添加了在延迟被“触发”时调用的回调processOutput - 即result已准备就绪。

HTH

答案 1 :(得分:3)

延迟就像是未来返回输出的承诺。您真的应该阅读有关Deferreds herehere的文档。此外,您应该阅读Python装饰器。一个介绍是here

更具体地说,发生的事情是当你调用getProcessOutput()时,结果还没有准备好。它可能在瞬间或一小时内就绪。但是你可能并不关心:只要它准备就绪,你可能想要获取输出并将其传递给函数。因此,getProcessOutput不返回输出(不会立即就绪),而是返回一个延迟对象。当输出最终就绪时,延迟对象将注意并调用您提供的任何处理函数,并传递实际的过程输出数据。你真的应该阅读延期信息。

答案 2 :(得分:1)

我不确定python,但这看起来像Active对象模式和Futures。期货将成为下一个c ++版本的标准。如果你阅读Active object和Futures,你会得到一个想法