關於協程的 send None

2021-08-27 03:11:09 字數 1204 閱讀 8295

這段時間太忙了,沒時間更新部落格。

今天把python撿起來,看了下 協程。記錄乙個一開始沒太明白的點。

直接貼**:

def consumer():

r = ''

j = 0

while true:

n = yield r # 3

j = j + 1

print('********j=%d' %j)

if not n:

return

print('[consumer] consuming %s...' % n)

r = '200 ok'

def produce(c):

c.send(none) # 1

print('------------')

n = 0

while n < 5:

n = n + 1

print('[producer] producing %s...' % n)

r = c.send(n) # 2

print('[producer] consumer return: %s' % r)

c.close()

if __name__ == "__main__":

c = consumer()

produce(c)

一開始沒弄明白 #1 標記出的 

c.send(none)
有什麼意義。但拿掉這一句後程式會報出如下錯誤:

f:\python_projects\python_test>python new.py

------------

[producer] producing 1...

traceback (most recent call last):

file "new.py", line 26, in produce(c)

file "new.py", line 20, in produce

r = c.send(n) # 2

typeerror: can't send non-none value to a just-started generator

搜尋一下才明白:

是因為協程還未啟用(gen_created 狀態)要呼叫next(c) 啟用協程,也可以呼叫c.send(none)來啟用

關於協程 nodejs和golang協程的不同

nodejs和golang都是支援協程的,從表現上來看,nodejs對於協程的支援在於async await,golang對協程的支援在於goroutine。關於協程的話題,簡單來說,可以看作是非搶占式的輕量級執行緒。一句話概括,上面提到了 可以看作是非搶占式的輕量級執行緒 在多執行緒中,把一段 放...

協程巢狀協程

import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...

關於協程的問題總結

協程其實就是可以由程式自主控制的執行緒 在python裡主要由yield 和yield from 控制,可以通過生成者消費者例子來理解協程 利用yield from 向生成器 協程 傳送資料 傳統的生產者 消費者是乙個執行緒寫訊息,乙個執行緒取訊息,通過鎖機制控制佇列和等待,但一不小心就可能死鎖。如...