how to add a coroutine to a running asyncio loop?

后端 未结 4 1172
慢半拍i
慢半拍i 2020-12-23 16:20

How can one add a new coroutine to a running asyncio loop? Ie. one that is already executing a set of coroutines.

I guess as a workaround one could wait for existing

4条回答
  •  Happy的楠姐
    2020-12-23 17:20

    Your question is very close to "How to add function call to running program?"

    When exactly you need to add new coroutine to event loop?

    Let's see some examples. Here program that starts event loop with two coroutines parallely:

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

    Output:

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

    May be you need to add some coroutines that would take results of coro1 and use it as soon as it's ready? In that case just create coroutine that await coro1 and use it's returning value:

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

    Output:

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

    Think about coroutines as about regular functions with specific syntax. You can start some set of functions to execute parallely (by asyncio.gather), you can start next function after first done, you can create new functions that call others.

提交回复
热议问题