Python协程和委派语法

示例

在发布Python 3.5+之前,该asyncio模块使用生成器来模仿异步调用,因此其语法与当前的Python 3.5版本不同。

Python 3.x 3.5

Python 3.5引入了asyncandawait关键字。请注意在调用周围没有括号。await func()

import asyncio

async def main():
    print(await func())

async def func():
    # 做时间密集的东西...
    return "Hello, world!"

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
的Python 3.x 3.3 3.5

在Python 3.5之前,@asyncio.coroutine装饰器用于定义协程。表达式的产量用于生成器委派。注意圆括号。yield from func()

import asyncio

@asyncio.coroutine
def main():
    print((yield from func()))

@asyncio.coroutine
def func():
    # 做时间密集的东西。
    return "Hello, world!"

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
Python 3.x 3.5

这是一个示例,显示了两个函数如何异步运行:

import asyncio

async def cor1():
    print("cor1 start")
    for i in range(10):
        await asyncio.sleep(1.5)
        print("cor1", i)

async def cor2():
    print("cor2 start")
    for i in range(15):
        await asyncio.sleep(1)
        print("cor2", i)

loop = asyncio.get_event_loop()
cors = asyncio.wait([cor1(), cor2()])
loop.run_until_complete(cors)