首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待事件循环中的未来/协同线;外部协同线

等待事件循环中的未来/协同线;外部协同线
EN

Stack Overflow用户
提问于 2019-10-31 04:38:26
回答 1查看 537关注 0票数 0

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

代码语言:javascript
复制
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-块?

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

我该怎么做?有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-31 14:46:46

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

当从另一个线程调用回调时,它可以使用run_coroutine_threadsafe将coroutine提交给(仍然功能齐全的)事件循环,并将结果报告给库:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58636990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档