1

私は、外部ジョブが終了したときにコールバックをスケジュールするオプションを提供するライブラリを持っています。 Future.set_result()にこのコールバックを使用するのは安全ですか?そうでない場合は、これを達成するための適切な方法は何ですか? Futureのドキュメントでは、そのメソッドはスレッドセーフではないと言われているので、これに問題があると想定しています。異なるスレッドからのコールバックにasyncio.Futureの値を設定する

私の目標は、PyOpenCLのOpenCLイベントをasyncioコードで待っているオブジェクトとして使用することです。将来の値はコールバックに設定されるべきであると思われる、もう少し徹底的にドキュメントを読んだ後

async def do_slow_stuff(): 
    ev1 = pyopencl.enqueue_something() 
    ev2 = pyopencl.enqueue_something_else(wait_for=[ev1]) 
    await wrap_opencl_event(ev2) 
    process_results() 

答えて

1

def wrap_opencl_event(event): 
    f = asyncio.Future() 
    event.set_callback(pyopencl.command_execution_status.COMPLETE, lambda x: f.set_result(None)) 
    return f 

と、このようにそれを使用した:私はこのようなヘルパー関数を考えていましたイベントループでスケジュール:

def wrap_opencl_event(event): 
    loop = asyncio.get_event_loop() 
    f = loop.create_future() 
    event.set_callback(pyopencl.command_execution_status.COMPLETE, 
         lambda status: loop.call_soon_threadsafe(f.set_result, None)) 
    return f 
0

別のオプションはconcurrent.futuresを使用し、将来の

をラップすることです
import asyncio.futures, concurrent.futures 
async def func_returning_future(loop): 
    fut = concurrent.futures.Future() 
    # Pass off to your other thread somehow 
    # and return a wrapped future for asyncio 
    return asyncio.futures.wrap_future(fut, loop = loop) 

それとも、

await asyncio.futures.wrap_future(fut, loop = loop) 
と最後の行を置き換え、ループ内でそれをしても待つことができdefで関数は非同期であるため、
関連する問題