2016-11-08 5 views
1

add_done_callbackメソッドは、最近配布されたFutureオブジェクトに追加されました。これにより、成功したかどうかにかかわらず、後で何らかのアクションを取ることができます。あなたが直接渡さ将来のオブジェクトのメソッドresultexceptionまたはtracebackのいずれかを呼び出そうと将来のコールバックの結果を得るには?

http://distributed.readthedocs.io/en/latest/api.html?highlight=add_done_callback#distributed.client.Future.add_done_callback

コールバック関数がハングします。次のように

例外とトレースバックしかしコールバックにアクセスすることができる。 結果と同じパターンを試し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 

できずコールバックの将来の結果にアクセスするには、コールバックを追加できることが私には限られています。

私は何かを逃しています - コールバックの将来の結果を得る方法がありますか?

直接 resultメソッドにアクセスすることは可能である例与えるようasyncioのドキュメントで

​​

...私は、これは、分散/竜巻に関連するかどうかはわかりませんが、それを非常に同じことをすることができるようになるでしょう。

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) 

答えて

1

現在、コールバックは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_callbackと対話するための最も直感的な方法ではないことを強調して、私たちは破壊を導入した場合、私は驚かないだろうそれ以降のバージョンでは変更されます。

In [8]: import distributed 

In [8]: distributed.__version__ 
Out[8]: '1.14.0' 
関連する問題