gpt4 book ai didi

python - 在来自不同线程的回调中设置 asyncio.Future 的值

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:49 25 4
gpt4 key购买 nike

我有一个库,可以让我选择在外部作业完成时安排回调。将此回调用于 Future.set_result() 是否安全?如果不是,实现这一目标的正确方法是什么? Future 的文档说它的方法不是线程安全的,所以我认为这可能有问题。

我的目标是使用 PyOpenCL 中的 OpenCL 事件作为异步代码中的可等待对象。我在考虑这样的辅助函数:

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

并以这种方式使用它:

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

最佳答案

在更彻底地阅读文档后,似乎 future 的值(value)应该在事件循环安排的回调中设置:

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

关于python - 在来自不同线程的回调中设置 asyncio.Future 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43550756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com