首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向运行中的异步循环添加协同线?

如何向运行中的异步循环添加协同线?
EN

Stack Overflow用户
提问于 2015-12-28 19:20:24
回答 5查看 68.3K关注 0票数 71

如何在运行中的异步循环中添加一个新的协同机制?即。已经在执行一组协同线的人。

我想,作为一种解决办法,我们可以等待现有的协同机制完成,然后初始化一个新的循环(使用附加的协同线)。但还有更好的方法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-12-28 19:59:09

您可以使用create_task来调度新的协同任务:

代码语言:javascript
复制
import asyncio

async def cor1():
    ...

async def cor2():
    ...

async def main(loop):
    await asyncio.sleep(0)
    t1 = loop.create_task(cor1())
    await cor2()
    await t1

loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
票数 39
EN

Stack Overflow用户

发布于 2017-10-12 13:23:00

若要向已经运行的事件循环添加函数,可以使用:

asyncio.ensure_future(my_coro())

在我的例子中,我使用了多线程(threading)和asyncio,并希望在已经运行的事件循环中添加一个任务。对于处于相同情况的其他人,请确保显式地声明事件循环(因为在Thread中不存在事件循环)。即:

在全球范围内:

代码语言:javascript
复制
event_loop = asyncio.get_event_loop()

然后,在你的Thread里面

代码语言:javascript
复制
asyncio.ensure_future(my_coro(), loop=event_loop)
票数 38
EN

Stack Overflow用户

发布于 2015-12-30 08:21:44

您的问题非常接近于“如何向运行中的程序添加函数调用?”

确切地说,什么时候需要向事件循环添加新的协同线?

让我们看看一些例子。这里,以两个协同线启动事件循环的程序是并行的:

代码语言:javascript
复制
import asyncio
from random import randint


async def coro1():
    res = randint(0,3)
    await asyncio.sleep(res)
    print('coro1 finished with output {}'.format(res))
    return res

async def main():
    await asyncio.gather(
        coro1(),
        coro1()
    ) # here we have two coroutines running parallely

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

输出:

代码语言:javascript
复制
coro1 finished with output 1
coro1 finished with output 2
[Finished in 2.2s]

您可能需要添加一些协同器,以获取coro1的结果,并在它准备好后立即使用它?在这种情况下,只需创建等待coro1并使用它的返回值的协同:

代码语言:javascript
复制
import asyncio
from random import randint


async def coro1():
    res = randint(0,3)
    await asyncio.sleep(res)
    print('coro1 finished with output {}'.format(res))
    return res

async def coro2():
    res = await coro1()
    res = res * res
    await asyncio.sleep(res)
    print('coro2 finished with output {}'.format(res))
    return res

async def main():
    await asyncio.gather(
        coro2(),
        coro2()
    ) # here we have two coroutines running parallely

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

输出:

代码语言:javascript
复制
coro1 finished with output 1
coro2 finished with output 1
coro1 finished with output 3
coro2 finished with output 9
[Finished in 12.2s]

将coroutines看作是具有特定语法的正则函数。您可以启动一些函数集来并行执行(通过asyncio.gather),您可以在第一次完成之后启动下一个函数,您可以创建调用其他函数的新函数。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34499400

复制
相关文章

相似问题

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