我有两个共享一些状态的 Python 线程,A以及B. 在某一时刻,A提交一个回调以B在其循环中运行,例如:# This line is executed by Aloop.call_soon_threadsafe(callback)在此之后,我想继续做其他事情,但我想确保在这样做之前callback已经运行B过了。有没有办法(除了标准线程同步原语)A等待回调的完成?我知道call_soon_threadsafe返回一个asyncio.Handle可以取消任务的对象,但我不确定这是否可以用于等待(我仍然不太了解asyncio)。在这种情况下,这个回调调用loop.close()并取消剩下的任务,并在此之后,在B之后,loop.run_forever()还有一个loop.close()。因此,对于这个用例,特别是允许我知道A循环何时有效关闭的线程安全机制也适用于我 - 同样,不涉及互斥锁/条件变量/等。我知道这asyncio并不意味着线程安全,只有很少的例外,但我想知道是否提供了一种方便的方法来实现这一点。这是我的意思的一小部分,以防万一。import asyncioimport threadingimport timedef thread_A(): print('Thread A') loop = asyncio.new_event_loop() threading.Thread(target=thread_B, args=(loop,)).start() time.sleep(1) handle = loop.call_soon_threadsafe(callback, loop) # How do I wait for the callback to complete before continuing? print('Thread A out')def thread_B(loop): print('Thread B') asyncio.set_event_loop(loop) loop.run_forever() loop.close() print('Thread B out')def callback(loop): print('Stopping loop') loop.stop()thread_A()我已经尝试过这种变体,asyncio.run_coroutine_threadsafe但它不起作用,而是线程A永远挂起。不确定是我做错了什么还是因为我正在停止循环。import asyncioimport threadingimport timedef thread_A(): global future print('Thread A') loop = asyncio.new_event_loop() threading.Thread(target=thread_B, args=(loop,)).start() time.sleep(1) future = asyncio.run_coroutine_threadsafe(callback(loop), loop) future.result() # Hangs here print('Thread A out')def thread_B(loop): print('Thread B') asyncio.set_event_loop(loop) loop.run_forever() loop.close() print('Thread B out')async def callback(loop): print('Stopping loop') loop.stop()thread_A()
添加回答
举报
0/150
提交
取消