asyncio如何在运行循环的其他协同例程中运行独立协同例程.Python 3.5

时间:2016-12-20 16:15:48

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

必要时,主循环运行协程将会完成某些事情。从中,启动另一个不会阻止的协程。使用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来实现这一点

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

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的精彩篇章......以防万一。