我有一些这个结构的代码:
def my_callback():
loop = asyncio.get_event_loop()
return loop.run_until_complete(my_coroutine_2())
async def my_coroutine_2():
return await my_stuff.some_future
async def my_coroutine():
not_my_code.library_function(my_callback)在my_callback ( library_function调用的)内部,我需要访问并运行协同代码。
但是,run_until_complete会产生一个错误:Event loop already running!。
是否有可能完成上面所描述的?
也就是说,是否有一个普通的函数调用会导致事件循环暂停当前执行的任何协同线(即loop.run_until_complete()的调用方),并继续执行其他协同线(包括传递给run_until_complete()的协同线),直到所请求的协同线完成为止,在这种情况下,普通函数un-块?
我认为线程可能会有所帮助,但据我所知,所有协同线都必须属于同一个线程。
我该怎么做?有可能吗?
发布于 2019-10-31 14:46:46
假设外部库是线程安全的,则可以使用run_in_executor调用其函数。在等待函数完成时,当前协同线将被阻塞,但事件循环将继续运行。
当从另一个线程调用回调时,它可以使用run_coroutine_threadsafe将coroutine提交给(仍然功能齐全的)事件循环,并将结果报告给库:
async def my_coroutine():
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, not_my_code.library_function,
lambda: my_callback(loop))
def my_callback(loop):
return asyncio.run_coroutine_threadsafe(my_coroutine_2(), loop)https://stackoverflow.com/questions/58636990
复制相似问题