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'