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)