2010-03-12 45 views
3

什么是装饰Python的扭曲反应器类

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

还什么都推迟字符串,例如在

twisted.internet.utils.getProcessOutput() 

返回一个字符串递延究竟这里发生的一切有什么意义?

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

回答

3

一个Deferred像一个承诺,在未来返回的输出。你真的应该阅读关于延期herehere的文档。另外,你应该一般阅读Python装饰器。一个介绍是here

更具体地说,发生的情况是,当您调用getProcessOutput()时,结果尚未完全准备就绪。它可能在一瞬间或一小时内就绪。但是你可能不在意:只要准备好了,你可能想要把输出传递给一个函数。因此,getProcessOutput不是返回输出(不会立即准备好),而是返回一个延迟对象。当输出终于准备就绪时,延迟对象会通知并调用您提供的任何处理函数,并传递实际的处理输出数据。尽管如此,你真的应该阅读延期。

1

我不确定python,但这看起来像一个活动对象模式,和期货。期货将成为下一个C++版本的标准。如果通过活动对象及期货读,你会得到一个想法

+2

@anijhaw,请抵制如此使用作为一个论坛 – 2010-03-13 13:03:00

4

在正常的编程习惯,你会怎么做

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

现在根据您的数据库和网络,这3个语句可以在任何地方从毫秒拿几秒钟。

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

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

输入扭曲和延期。

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

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

提供如执行的第一条语句很快,它返回“东西”回来了。那东西是Deferred。那里没有阻塞,没有等待。并且对此Deferred添加回调processOutput,该回调在延迟被“解雇”时调用 - 即result已准备就绪。

HTH

+0

感谢的冲动使得它晶莹剔透 – anijhaw 2010-03-13 21:53:14