協(xié)程和生成器都使用yield關(guān)鍵字莉钙。但是協(xié)程更像是對生成器語法的一些擴(kuò)展
- 在生成器中, yield 只對外產(chǎn)出值
- 在協(xié)程中廓脆,yield能對外產(chǎn)出值,而且能接收通過send()方法傳入值
下面是一段生成器的代碼
def simple_generator():
c = yield 1
if c is None:
print("c is None")
# 代碼運(yùn)行后磁玉,返回結(jié)果為
# generator = simple_generator()
# next(generator) -> 1
# next(generator) -> c is None
可以發(fā)現(xiàn)生成器語法中, generator不返回值停忿。
上面的代碼等價(jià)于
def simple_generator():
yield 1
下面是一段協(xié)程的代碼
def simple_coro2(a):
print("-> Started: a =", a)
b = yield a
print("-> Received: b: =", b)
c = yield a + b
print("-> Received: c=", c)
當(dāng)前代碼的執(zhí)行結(jié)果
可以看到在生成器中,每次調(diào)用send()方法時(shí)蚊伞,yield語句對外返回yield右側(cè)的值席赂,再將輸入的值賦值給左側(cè)的變量。所以協(xié)程在yield上做了拓展厚柳。能接收一些參數(shù)
協(xié)程有四個(gè)狀態(tài)
- GEN_CREATED
- GEN_RUNNING
- GEN_SUSPEND
- GEN_CLOSED
每個(gè)協(xié)程在使用時(shí)氧枣,必須進(jìn)行初始化。否則拋出異常
TypeError: can't send non-None value to a just-started generator