我正在试图弄清楚如何使代码更多地使用扭式异步。
deferred_obj.callback提供一些结果之后调用。但是,链式回调不会被认为是异步的,因为它们是链式的,事件循环将同时触发其中的每个回调,直到没有更多的回调,对吗?
但是,如果我有一个延迟对象,并且我将deferred_obj.callback作为其回调附加到d.addCallback(deferred_obj.callback)中,那么这将被认为是异步的,因为deferred_obj正在等待数据,而传递数据的方法也在等待数据,但是一旦I d.callback 'd‘对象处理数据,它就调用deferred_obj.callback,但是由于这个对象是延迟的,不像链式回调那样,它将异步执行.对,是这样?
假设我的所有代码都是非阻塞的,这意味着链式回调不是异步的,而链式延迟是异步的,对吗?
发布于 2010-12-29 09:54:13
回调(默认情况下)是同步的。然而,正如扭曲的医生所指出的:
如果您需要延迟等待另一个延迟,则只需从添加到addCallbacks的方法返回延迟推断。
因此,您可以使用它在回调链中执行一些异步处理。让我们这样做:
from twisted.internet import reactor, defer
def callback_func_2(result, previous_data):
# here we pass the result of the deferred down the callback chain
# (done synchronously)
print "calling function 1 on result:%s with previous result:%s" % (result, previous_data)
return result
def callback_func(result):
#let's do some asynchronous stuff in this callback
# simple trick here is to return a deferred from a callback
# instead of the result itself.
#
# so we can do asynchronous stuff here,
# like firing something 1 second later and have
# another method processing the result
print "calling function 1 on result:%s" % result
d = defer.Deferred()
reactor.callLater(1, d.callback, "second callback")
d.addCallback(callback_func_2, result)
return d
def do():
d = defer.Deferred()
reactor.callLater(1, d.callback, "first callback")
d.addCallback(callback_func)
return d
do()
reactor.run()发布于 2010-12-27 21:22:19
算是吧,但是在这种类型的事件处理中没有并发性。在代码返回到事件循环之前,不会调用新的回调。因此回调链是同步的。它只在事件循环中异步。
这是这类编程的一个警告,处理程序最快速地执行,并尽快返回到事件循环。它不应该在处理程序中执行任何耗时的任务。
发布于 2010-12-27 22:40:06
使用延迟并不会使代码异步。
import time
from twisted.internet import defer
from twisted.internet import reactor
def blocking(duration, deferred):
print "start blocking"
time.sleep(duration)
print "finished blocking"
deferred.callback(True)
def other_task():
print "working..."
reactor.callLater(1, other_task)
def finish(result):
print "stopping reactor in 2sec"
reactor.callLater(2, reactor.stop)
def failed(reason):
print reason
print "stopping reactor in 2sec"
reactor.callLater(2, reactor.stop)
def main():
d = defer.Deferred()
d.addCallbacks(finish, failed)
reactor.callLater(0, blocking, 5, d)
if __name__ == "__main__":
reactor.callLater(0, other_task)
main()
reactor.run()如果您有长期运行的同步代码,则可以使用协操作符( deferToThread ) (twisted.internet.task)将其分解为短迭代。
https://stackoverflow.com/questions/4541853
复制相似问题