代码之家  ›  专栏  ›  技术社区  ›  Zero Ainz

python协程和while循环,如何运行两者

  •  1
  • Zero Ainz  · 技术社区  · 2 年前

    我试图同时运行两个协同程序,并使用async,一个是teleton电报客户端,另一个是异步任务,它每分钟为电报机器人获取数据。一些代码:

    from asyncio import Runner
    from asyncio import sleep
    import asyncio
    async def task_coro1():
        print('First coro')
        await sleep(1)
        while True:
            #do something
            pass
    
    async def task_coro2():
        print('Second coro')
        await sleep(1)
        while True:
            #do something
            pass
    
    asyncio.run(task_coro1())
    asyncio.run(task_coro2())
    

    已经尝试使用asyncio.gather和线程

    #已解决

    过了一段时间,我意识到电视台已经有了循环。。。刚刚在他的事件循环中添加了第二个协同程序的任务

    2 回复  |  直到 2 年前
        1
  •  0
  •   Rauññ    2 年前

    你就快到了

    from asyncio import Runner
    from asyncio import sleep
    import asyncio
    
    async def task_coro1():
        print('First coro')
        await sleep(3)
        while True:
            await sleep(2)
            print('First coro keeps working!')
            pass
    
    async def task_coro2():
        print('Second coro')
        await sleep(2)
        while True:
            await sleep(2)
            print('Second coro keeps working!')
            pass
    
    async def main():
        await asyncio.gather(task_coro1(),task_coro2())
    
    if __name__ == "__main__":
        asyncio.run(main())
    

    通过收集这两个协同程序,它们将使用同一个线程一起工作。

    请注意,当一个协程阻塞CPU线程时,另一个将不会运行。这不是你在原帖子中提到的线程

        2
  •  0
  •   Booboo    2 年前

    为什么不只是:

    import asyncio
    
    async def task_coro1():
        print('First coro')
        await asyncio.sleep(1)
        while True:
            #do something
            pass
    
    async def task_coro2():
        print('Second coro')
        await asyncio.sleep(1)
        while True:
            #do something
            pass
    
    async def main():
        await asyncio.gather(task_coro1(), task_coro2())
    
    asyncio.run(main())
    
    推荐文章