Python 如何在回调中获得未来的结果?
最近将Python 如何在回调中获得未来的结果?,python,distributed,dask,Python,Distributed,Dask,最近将add\u done\u callback方法添加到分布式Future对象中,该对象允许您在Future完成后执行某些操作,而不管是否成功 如果您试图直接调用传递的未来对象上的任何方法result、exception或traceback,则回调函数将挂起 但是,可以在回调中访问异常和回溯,如下所示: fut.\u exception().result() fut.\u traceback().result() 对结果尝试相同的模式-即fut.\u result().result()会引发
add\u done\u callback
方法添加到分布式Future
对象中,该对象允许您在Future完成后执行某些操作,而不管是否成功
如果您试图直接调用传递的未来对象上的任何方法result
、exception
或traceback
,则回调函数将挂起
但是,可以在回调中访问异常和回溯,如下所示:
fut.\u exception().result()
fut.\u traceback().result()
对结果尝试相同的模式-即fut.\u result().result()
会引发异常:
File "C:\Python\lib\site-packages\tornado\concurrent.py", line 316, in _check_done
raise Exception("DummyFuture does not support blocking for results")
Exception: DummyFuture does not support blocking for results
如果不能在回调中访问将来的结果,那么能够添加回调对我来说用处有限
我是否遗漏了什么——有没有办法在回调中得到未来的结果
在asyncio文档中,它似乎给出了一个可以直接访问结果
方法的示例:
…我不确定这与龙卷风/分布式有何关系,但如果能够做到这一点,将非常有用
来自分布式导入客户端的
客户=客户(“127.0.0.1:8786”)
def f(延迟):
从时间上导入睡眠
从numpy.random导入randn
睡眠(延迟)
如果randn()>1:
1/0
返回延迟
def回调(fut):
导入日志记录
logger=logging.getLogger('distributed')
如果fut.status==“已完成”:
res=future._result().result()#当前您的回调在Tornado事件循环中被调用。如果你想得到未来的结果,你必须使用Tornado API
下面是一个简单的例子:
In [1]: from distributed import Client
In [2]: client = Client()
In [3]: def inc(x):
...: return x + 1
...:
In [4]: from tornado import gen
In [5]: @gen.coroutine
...: def callback(future):
...: result = yield future._result()
...: print(result * 10)
...:
In [6]: future = client.submit(inc, 1)
In [7]: future.add_done_callback(callback)
20
然而,您的问题突出表明,对于用户来说,这可能不是与add_done_回调交互的最直观的方式,因此,如果我们为以后的版本引入了突破性的更改,我不会感到惊讶
In [8]: import distributed
In [8]: distributed.__version__
Out[8]: '1.14.0'