Python 3.x 在事件循环内等待未来/协同程序;外协程

Python 3.x 在事件循环内等待未来/协同程序;外协程,python-3.x,asynchronous,concurrency,python-asyncio,coroutine,Python 3.x,Asynchronous,Concurrency,Python Asyncio,Coroutine,我有一些这样结构的代码: 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

我有一些这样结构的代码:

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)
库函数
调用的
我的回调
中,我需要访问并运行协同程序代码

但是,
运行直到\u完成
产生错误:
事件循环已在运行

有可能完成上述内容吗?

也就是说,是否有一个普通函数调用会导致事件循环暂停当前正在执行的任何协程(即
循环的调用方。运行_直到_complete()
),并继续执行其他协程(包括传递给
运行_直到_complete()
)直到请求的协程完成,在这种情况下,普通功能un阻塞

我认为线程可能会有所帮助,但据我所知,所有的协同程序都必须属于同一个线程


我该怎么做?有可能吗?

假设外部库是线程安全的,您可以使用离线调用它的函数。在等待函数完成时,当前协同程序将被阻止,但事件循环将继续运行

当您的回调从另一个线程调用时,它可以用于将协同例程提交到(仍然完全功能)事件循环,并将结果报告回库:

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)

好吧,这确实回答了问题!不幸的是,为了简化示例,我改变了一个重要的细节:实际上是外部库启动循环并调用库函数;所以我没有选择改变它的通话方式。所以你的答案是正确的,但对我没有帮助!尽管如此,我还是会接受它。@trbabb您的协同程序需要做的事情是否与库运行的协同程序相关?换句话说,如果两者在不同且不相关的事件循环中运行会有问题吗?-我的协同程序等待库的循环中产生的协同程序/未来。@trbabb现在这真是一个难题。总而言之:您有一个使用asyncio实现的库,它坚持在自己的同步代码中运行事件循环,并在事件循环中运行它调用同步回调函数并期望响应?在同步回调中,您需要等待库生成的其他任务吗?如果是这样,恐怕asyncio没有提供这样做的方法,因为它明确禁止嵌套事件循环,并且不能使用多个事件循环。听起来这个库要么设计得很糟糕,要么你误用了它。。。对它的设计质量没有任何评论/使用它有多“有趣”:|