为了账号安全,请及时绑定邮箱和手机立即绑定

如何等待从另一个线程提交的回调完成?

如何等待从另一个线程提交的回调完成?

慕盖茨4494581 2021-08-05 10:39:26
我有两个共享一些状态的 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()
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号