Python Twisted-运行多个回调
我是twisted的新手,我真的需要一件事——运行任意数量的函数(从同一个tame开始),收集所有函数的结果并进行一些处理 以下是我所拥有的:Python Twisted-运行多个回调,python,asynchronous,callback,twisted,Python,Asynchronous,Callback,Twisted,我是twisted的新手,我真的需要一件事——运行任意数量的函数(从同一个tame开始),收集所有函数的结果并进行一些处理 以下是我所拥有的: from twisted.internet import defer import time # slow computing query def process_data(num, data): time.sleep(5) array = [] # mock the results obtained from process
from twisted.internet import defer
import time
# slow computing query
def process_data(num, data):
time.sleep(5)
array = []
# mock the results obtained from processed data
for i in range(0, 5):
array.append(num)
return array
def process_results(arrays):
# this should collect return arrays of all callbacks
print arrays
data = []
callbacks_refs = []
for i in range(0, 5):
d=defer.Deferred()
d.addCallback(process_data)
callbacks_refs.append(d)
callbacks = defer.DeferredList(callbacks_refs)
callbacks.addCallback(process_results)
for i, d in enumerate(callbacks_refs):
d.callback(i, data)
我希望最后一个for循环将异步启动所有回调的执行(就像通常的承诺一样),所有结果都将传递给process_results函数,该函数将在所有回调完成后执行,但是我觉得我错得很厉害。我不知道这是否有解决办法,但是按照您制作
延迟.callback()
的方式,您将错误的参数传递到回调
如果将errback与回调一起附加,您可能会发现您只是得到了大量失败的结果。。。因此,这是可行的,但并非如预期的那样
我看到两个修正
from functools import partial
for i in range(0, 5):
d=defer.Deferred()
d.addCallback(partial(process_data,i,data[i]))
# This partial is still kinda crooked, but hopefully I have made my point
callbacks_refs.append(d)
或者更改在回调函数中传递数据的方式
# slow computing query
def process_data(data_dict):
#data_dict['num']
#data_dict['data']
#...and further down
d.callback({'num':4,'data':(1,2,3)})
很抱歉,我对延迟列表不太熟悉,但我认为一旦您修复延迟,延迟列表可能会自动工作。我不知道您的示例与您的实际代码有多相似,但示例代码显示了对Twisted的一些误解。Twisted不会神奇地使同步代码异步。您正在
time.sleep中阻塞事件循环。如果您正在执行CPU限制的操作(与I/O限制相反),那么可以使用多个线程或进程
我将假定process\u data
是一个阻塞调用,并为您提供一个基于多线程的解决方案:
import time
from twisted.internet import defer, task, threads
# slow computing query
def process_data(num):
time.sleep(5)
array = []
# mock the results obtained from processed data
for i in range(0, 5):
array.append(num)
return array
def process_results(arrays):
# this should collect return arrays of all callbacks
print arrays
def main(_):
callbacks_refs = []
for i in range(0, 5):
callbacks_refs.append(threads.deferToThread(process_data, i))
callbacks = defer.DeferredList(callbacks_refs)
callbacks.addCallback(process_results)
return callbacks
task.react(main)
我还将给您一个关于Twisted编程的一般建议-如果您发现自己键入了d=defer.Deferred()
,那么您的设计可能有问题