cub*_*ube 4 python multithreading thread-safety python-3.x python-asyncio
我有一个库,可以让我选择在外部作业完成时安排回调。使用此回调是否安全Future.set_result()?如果没有,实现这一目标的正确方法是什么?Future 的文档说它的方法不是线程安全的,所以我认为这可能有问题。
我的目标是使用来自 PyOpenCL 的 OpenCL 事件作为 asyncio 代码中的可等待对象。我在考虑这样的辅助函数:
def wrap_opencl_event(event):
f = asyncio.Future()
event.set_callback(pyopencl.command_execution_status.COMPLETE, lambda x: f.set_result(None))
return f
Run Code Online (Sandbox Code Playgroud)
并以这种方式使用它:
async def do_slow_stuff():
ev1 = pyopencl.enqueue_something()
ev2 = pyopencl.enqueue_something_else(wait_for=[ev1])
await wrap_opencl_event(ev2)
process_results()
Run Code Online (Sandbox Code Playgroud)
更彻底地阅读文档后,似乎应该在事件循环调度的回调中设置未来的值:
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
Run Code Online (Sandbox Code Playgroud)