当前位置:  开发笔记 > 编程语言 > 正文

如何将coroutine添加到正在运行的asyncio循环?

如何解决《如何将coroutine添加到正在运行的asyncio循环?》经验,为你挑选了3个好方法。

如何为正在运行的asyncio循环添加新的协同程序?IE浏览器.一个已经执行了一套协同程序的程序.

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



1> Jashandeep S..:

您可以使用它create_task来安排新的协同程序:

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()


谢谢你的努力,但据我所知,这个答案是错误的.这里第一次调用`main`创建了协程,然后循环开始.换句话说,此示例在循环开始之前调度协同程序.这不是我要求的.
循环运行时,你不能调用`loop.run_until_complete()`

2> Dotl..:

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

asyncio.ensure_future(my_coro())

在我的情况下,我一直在使用多线程(threading),asyncio并希望将一个任务添加到已经运行的事件循环中.对于处于相同情况的任何其他人,请务必明确说明事件循环(因为在一个内部不存在Thread).即:

在全球范围内:

event_loop = asyncio.get_event_loop()

然后,在你的内心Thread:

asyncio.ensure_future(my_coro(), loop=event_loop)



3> Mikhail Gera..:

您的问题非常接近"如何向正在运行的程序添加函数调用?"

什么时候需要为事件循环添加新的协同程序?

我们来看一些例子.这里程序用两个协同程序并行启动事件循环:

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())

输出:

coro1 finished with output 1
coro1 finished with output 2
[Finished in 2.2s]

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

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())

输出:

coro1 finished with output 1
coro2 finished with output 1
coro1 finished with output 3
coro2 finished with output 9
[Finished in 12.2s]

将协程视为具有特定语法的常规函数​​.你可以启动一些函数并行执行(by asyncio.gather),你可以在第一次完成后启动下一个函数,你可以创建调用其他函数的新函数.


协同程序*同时运行*,而不是*并行运行*.不太一样的事情.
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有