【问题标题】:How in asyncio run independence co-routine in other co-routine from run loop.Python 3.5如何在 asyncio 中从 run loop.Python 3.5 运行其他协程中的独立协程
【发布时间】:2016-12-20 16:15:48
【问题描述】:

必要的,用主循环运行协程,会做一些事情。并从中启动另一个不会阻塞的协程。使用 Python 3.5

import asyncio,time  
async def cor1():
    for i in range(10):
        await asyncio.sleep(0)
        print("cor1",i)

async def cor2():
    for i in range(10):
        await asyncio.sleep(0)
        time.sleep(1)
        print("cor2",i)

async def main():
    asyncio.ensure_future(cor1())
    asyncio.ensure_future(cor2())
    print("cor3")

loop = asyncio.get_event_loop()
asyncio.ensure_future(main())
loop.run_forever()

现在主循环创建了两个协程。但它们不是并行运行的,一个接一个。在一个完成之前,另一个不会开始工作。当然你可以在不同的线程上运行它们并使用队列建立通信。但是是否有可能在 python 3.5 中的 asyncio 的帮助下做到这一点

【问题讨论】:

    标签: python-3.x async-await python-asyncio


    【解决方案1】:

    这个决定帮助了我

    import asyncio,time
    from concurrent.futures import ProcessPoolExecutor
    def cor1():
        for i in range(10):
            print("cor1", i)
            time.sleep(2)
    
    def cor2():
        for i in range(10):
            print("cor2", i)
            time.sleep(1)
    
    executor = ProcessPoolExecutor(2)
    loop = asyncio.get_event_loop()
    
    asyncio.ensure_future(loop.run_in_executor(executor, cor1))
    asyncio.ensure_future(loop.run_in_executor(executor, cor2))
    
    loop.run_forever()
    

    【讨论】:

    • 这是否并行运行?我的意思是不同的过程。如果不是我该怎么做?@онстантин елопокатуновичь
    【解决方案2】:

    这是一种并行运行它们的方法:

    import asyncio
    
    async def cor1():
        for i in range(10):
            await asyncio.sleep(1)
            print("cor1", i)
    
    async def cor2():
        for i in range(10):
            await asyncio.sleep(1)
            print("cor2", i)
    
    loop = asyncio.get_event_loop()
    cors = asyncio.wait([cor1(), cor2()])
    loop.run_until_complete(cors)
    

    注意time.sleep(1)(不同于asyncio.sleep(1))是一个阻塞调用,不会同时运行。

    Luciano Ramalho 的书Fluent Python 有一个关于协程的精彩章节,asyncio... 以防万一。

    【讨论】:

    • 谢谢。虽然我没有看到特别的区别。 time.sleep(1) ,我的意思是执行一个长期的操作。在你的例子中,当一个函数没有完成它的动作时,另一个开始没有效果。而我的目标是实现并行执行跨度>
    • 如果您需要并行执行阻塞任务,您需要threadsmultiprocessing。 asyncio 类似于“协作多任务”;您的所有任务都需要是协程并产生 cpu 时间。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2021-10-24
    • 2019-12-18
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多