add_done_callback
方法最近被添加到分布式Future
对象中,它允许您在将来完成后采取一些操作,而不管它是否成功。如果你想直接调用任何方法result
,exception
或traceback
传递的未来对象如何在回调中获得未来的结果?
回调函数将挂起。
的例外,回溯可以但是在回调访问如下: fut._exception().result()
fut._traceback().result()
尝试,结果同样的模式 - 即fut._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文档似乎举个例子,其中直接访问result
方法是可行的:
...我不知道如何与龙卷风/分布式的,但它将是非常有用能够做到这一点。
from distributed import Client
client = Client("127.0.0.1:8786")
def f(delay):
from time import sleep
from numpy.random import randn
sleep(delay)
if randn() > 1:
1/0
return delay
def callback(fut):
import logging
logger = logging.getLogger('distributed')
if fut.status == 'finished':
res = future._result().result() # <-------------- Doesn't work!
logger.info("{!r} - {!s}".format(fut, res))
else:
logger.info("{!r} - {!s}".format(fut, fut.status))
args = rand(10)
futs = client.map(f, args)
for fut in futs:
fut.add_done_callback(callback)