如何为正在运行的asyncio循环添加新的协同程序?IE浏览器.一个已经执行了一套协同程序的程序.
我想作为一种解决方法,可以等待现有协程完成,然后初始化一个新循环(使用附加协程).但有更好的方法吗?
您可以使用它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()
要向已经运行的事件循环添加函数,您可以使用:
asyncio.ensure_future(my_coro())
在我的情况下,我一直在使用多线程(threading
),asyncio
并希望将一个任务添加到已经运行的事件循环中.对于处于相同情况的任何其他人,请务必明确说明事件循环(因为在一个内部不存在Thread
).即:
在全球范围内:
event_loop = asyncio.get_event_loop()
然后,在你的内心Thread
:
asyncio.ensure_future(my_coro(), loop=event_loop)
您的问题非常接近"如何向正在运行的程序添加函数调用?"
什么时候需要为事件循环添加新的协同程序?
我们来看一些例子.这里程序用两个协同程序并行启动事件循环:
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
),你可以在第一次完成后启动下一个函数,你可以创建调用其他函数的新函数.