问题
我有一个库,目前没有异步支持,需要从异步代码调用。异步代码通过处理程序(下面代码中的handler函数)调用库。在执行处理程序时,库会定期调用回调(callback_wrapper)来报告进度。在
同步处理程序在ThreadPoolExecutor中执行,以便主事件循环能够在处理程序运行时处理进一步的事件。在
发生的情况是同步回调被立即执行,但是异步回调只在主处理程序执行之后执行。期望的结果是立即执行异步回调。在
我猜事件循环在run_in_executor调用时被阻塞,但我不确定如何解决这个问题。在
编码import asyncio
import time
from concurrent.futures.thread import ThreadPoolExecutor
loop = asyncio.get_event_loop()
def handler():
print('handler started')
callback_wrapper()
time.sleep(1)
print('handler stopped')
async def callback():
print('callback')
def callback_wrapper():
print('callback wrapper started')
asyncio.ensure_future(callback(), loop=loop)
print('callback wrapper stopped')
async def main():
handler()
with ThreadPoolExecutor() as pool:
async def thread_handler():
await loop.run_in_executor(pool, handler)
loop.run_until_complete(main())
输出
^{pr2}$
期望输出handler started
callback wrapper started
callback
callback wrapper stopped
handler stopped