yield
这个东西好像能做很多事,之前没理解,最近又看到,好像理解多了一点点,先记录一下。
看到的文章都说,yield类似return,但又不同,可以类比着去尝试理解。
我写了个获取配置数据的方法,一段时间内不需要更新,时间久了再更新。
用吃火锅来类比理解一下😂
import datetime, time
class Config: # 火锅店的鸳鸯锅
a = 1 # 清汤锅
b = 1 # 红汤锅
def update_config(): # 服务员进入服务状态
update_ts = 0 # 坐下,点个鸳鸯锅,一堆菜,都上齐了
while True: # 服务员很敬业,不停的过来看一眼
now = datetime.datetime.now().timestamp()
if now - update_ts >= 5: # 5秒钟过去了,服务员过来看看
Config.a += 1 # 加了点清汤
Config.b += 2 # 加了点红汤
update_ts = now # 刚加完,等会再来
yield # 加完汤说了句"先生您慢用",回到原位置,等待下次叫唤
cfg = update_config() # 服务员来迎客,开始服务
while True: # 客户是一个吃货,不停的点菜,不停的吃
next(cfg) # 喊了一声"服务员过来一下",服务员来了,开始继续服务...
# 听到服务员的"先生您慢用",客户又继续开始吃了
print(Config.a, Config.b) # 不能吃辣的涮清汤,爱吃辣的涮红汤
time.sleep(1) # 吃会儿,歇会儿
从客户角度去考虑代码执行的流程
- 进了店,服务员接待,落座点菜,等着上桌
- 有事会叫服务员过来
- 有时候服务员机灵,不需要吩咐(传参)就把事儿做了
- 有时候需要吩咐她具体要做什么(传参),然后等结果
- 等服务员把事做好了,继续吃
从服务员角度去考虑代码执行的流程
- 看见客人到,安排座位,记录点菜,这事做一次就可以
- 站在不远处等客人召唤
- 客人要加汤,服务员加汤,加完说“您慢用”(yield)
- 服务员暂时没事,客人继续吃
yield带返回和接受参数的情况
# 1 没有参数
if now - update_ts >= 5:
...
yield # 没有参数的情况,上面已经说到了
# 2 有参数
if now - update_ts >= 5:
...
plate yield food # <- 有参数的情况
- yield可以理解为服务员的服务行为
- 按照“yield类似return”的说法,服务员上菜(提供food参数)给客人
- 这时主要业务转移到客人这边,就是吃菜
- 客人吃菜得有一会儿——这段时间就对应服务员这边的业务停留在yield处的时间
- 直到客人召唤服务员,服务员过来以后,客人把空盘子递给服务员
- yield 左边参数plate就是客人给的空盘子
- 后续可以对plate做其他操作,但这都是服务员的事了,与客人无关
- yield也可能只有某一边带参数,好比服务员过来只是收plate,没有上food。或者只上food