协程的实现


Python3.5以前

使用生成器(yield)来实现

def count_down(n):
    """ 倒计时效果 """
    while n > 0:
        yield n
        n -= 1


if __name__ == '__main__':
    rest = count_down(5)
    print(next(rest))
    print(next(rest))
    print(next(rest))
    print(next(rest))
    print(next(rest))

以上命令输出结果为:

5
4
3
2
1

Python3.5以后

使用async和await关键字实现

def yield_test():
    """ 实现协程函数 """
    while True:
        n = (yield )
        print(n)


if __name__ == '__main__':
    rest = yield_test()
    next(rest)
    rest.send(6666)
    rest.send(6666)

以上命令输出结果为:

6666
6666

async关键字

  • 定义特殊函数
async def async_f():
    pass
  • 当被调用时,不执行里面的代码,而是返回一个协程对象
  • 在事件循环中调度其执行前,协程对象不执行任何操作

await关键字

  • 等待协程执行完成
  • 当遇到阻塞调用的函数的时候,使用await方法将协程的控制权让出,以便loop调用其他的协程

asyncio模块

  • get_event_loop()获得事件循环队列
  • run_until_complete()注册任务到队列
  • 在事件循环中调度其执行前,协程对象不执行任何操作
  • asyncio模块用于事件循环
import asyncio


async def do_sth(x):
    """ 定义协程函数 """
    print('等待中:{0}'.format(x))
    # 等待五秒钟
    await asyncio.sleep(x)


# 判断是否为协程函数
print(asyncio.iscoroutinefunction(do_sth))

coroutine = do_sth(5)
# 事件的循环队列
loop = asyncio.get_event_loop()
# 注册任务
task = loop.create_task(coroutine)
print(task)
# 等待协程任务执行结束
loop.run_until_complete(task)
print(task)

以上命令输出结果为:

True
<Task pending coro=<do_sth() running at /Users/bowyn/Desktop/Code/chapter10/use_async.py:4>>
等待中:5
<Task finished coro=<do_sth() done, defined at /Users/bowyn/Desktop/Code/chapter10/use_async.py:4> result=None>

人已赞赏
Python3

什么是协程?

2019-11-26 15:29:55

Python3

协程通信之嵌套调用

2019-12-1 22:15:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索