正在看《流畅的python》这本书,看到协程这个章节,先记录个很好的例子,后续详细补充读书笔记
- 定义一个计算移动平均值的协程
def gen_average():
total = 0.0
count = 0
average = None
while True:
item = yield average
total += item
count += 1
average = total / count
gen_average_obj = gen_average()
next(gen_average_obj) # 使用next函数预激协程,也可以使用gen_average_obj.send(None)来预激
gen_average_obj.send(2) # 2.0
gen_average_obj.send(4) # 3.0
- 预激协程的装饰器
预激是要让程序走到yield那一步,所以调用.send(x)之前一定记得要执行next(my_coro)
from functools import wraps
def coroutine(func):
@wraps(func)
def primer(*args, **kwargs):
gen = func(*args, **kwargs)
next(gen)
return gen
return primer
@coroutine
def gen_average():
total = 0.0
count = 0
average = None
while True:
item = yield average
total += item
count += 1
average = total / count
coro_avg = gen_average()
from inspect import getgeneratorstate # 这个貌似是py3开始有的内置库,py2.7会报错
getgeneratorstate(coro_avg) # 'GEN_SUSPENDED'
coro_avg.send(10) # 10.0
coro_avg.send(4) # 7.0
网友评论