一、Python实现协程


返回

1.1 greenlet第三方模块

  • 安装第三方模块pip3 install greenlet

  • 手动切换

  • 示例

    from greenlet import greenlet
    
    
    def func1():
        print(1)
        gr2.switch()  # 切换到 func2 函数
        print(2)
        gr2.switch()  # 切换到 func2 函数
    
    
    def func2():
        print(3)
        gr1.switch()  # 切换到 func1 函数,从上一次执行的位置继续向后执行
        print(4)
    
    
    gr1 = greenlet(func1)
    gr2 = greenlet(func2)
    
    gr1.switch()  # 执行 func1 函数,完整打印:1 3 2 4
    
    

1.2 yield关键字

  • 利用生成器实现协程

  • 手动切换

  • 示例

    def func1():
        yield 1
        yield from func2()  # 切换到 func2 函数
        yield 2
    
    
    def func2():
        yield 3
        yield 4
    
    
    f1 = func1()
    for item in f1:
        print(item)  # 完整打印:1 3 4 2
    
    

1.3 asyncio装饰器

  • 通过内置的asyncio模块实现协程(Python3.4版本之后)

  • 遇到IO阻塞自动切换

  • 示例

    import asyncio
    
    
    @asyncio.coroutine
    def func1():
        print(1)
        # 模拟网络IO请求:如下载一张图片
        yield from asyncio.sleep(3)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
        print(2)
    
    
    @asyncio.coroutine
    def func2():
        print(3)
        # 模拟网络IO请求:如下载一张图片
        yield from asyncio.sleep(2)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
        print(4)
    
    
    # loop = asyncio.get_event_loop()
    # loop.run_until_complete(func1())  # 执行协程函数 func1
    
    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func2())
    ]
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))  # 执行tasks任务列表中的协程函数,完整流程:[1 3] 4 2
    
    

1.4 async&await关键字【推荐】

  • 基于async&await关键字实现协程(Python3.5版本之后)

  • 功能同上,代码更加简洁

  • Python3.8之后 @asyncio.coroutine 装饰器被移除,推荐使用async&await关键字实现协程

  • 示例

    import asyncio
    
    
    async def func1():
        print(1)
        # 模拟网络IO请求:如下载一张图片
        await asyncio.sleep(3)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
        print(2)
    
    
    async def func2():
        print(3)
        # 模拟网络IO请求:如下载一张图片
        await asyncio.sleep(2)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
        print(4)
    
    
    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func2())
    ]
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))  # 执行tasks任务列表中的协程函数,完整流程:[1 3] 4 2
    
    
返回