協程是通過generator來實現的,就是yield關鍵字和send()函式的使用。
yield關鍵字可以將值(資訊)返回,同時在資訊返回後使程式停留在當前行。
>>> deftest():
... number=1...
while
true:
... number*=2...
yield
number
...
print('
yield下面的**')
...>>> t=test()
>>>t
>>>type(t)
'generator
'>
>>>next(t)
2>>>
>>>next(t)
yield下面的**
4>>>next(t)
yield下面的**
8>>>next(t)
yield下面的**
16
yield還可以接收呼叫者傳遞過來的資訊:通過sned()函式,將值(訊息)傳遞給生成器。生成器通過yield前面的變數來接收傳遞過來的值。
>>> deftst():
... number=1...
while
true:
... pam=yield
number
...
print('
yield下面**')
...
print('
呼叫者傳遞過來的值:
',pam)
...>>> tt=tst()
>>>tt.send(none)
1>>>tt.send(none)
yield下面**
呼叫者傳遞過來的值: none
1>>> tt.send(111)
yield下面**
呼叫者傳遞過來的值: 111
1
說明:send()函式和next()函式都推動生成器向下執行,next()函式僅僅是接收了yield右邊的返回值;而send()函式則可以使呼叫者給生成器發訊息。
呼叫close()函式就可以關閉生成器,接下來next()函式再應用於生成器就會提示生成器已停止的資訊
>>> deftest():
... number=1...
while
true:
... number*=2...
yield
number
...
print('
yield下面的**...')
...>>> gen=test()
>>>next(gen)
2>>>next(gen)
yield下面的**...
4>>>next(gen)
yield下面的**...
8>>>gen.close()
>>>next(gen)
traceback (most recent call last):
file
"", line 1, in
stopiteration
通過下面乙個消費者和生產者的例子,我們實現一下,生產者生產之後消費者立馬消費掉,來進一步了解協程。
注意:必須在呼叫send()前,啟動生成器。啟動生成器可以是next(生成器)或者生成器.send(none),讓生成器執行到第乙個yield處。之後就可以不斷使用send()傳入值了。
defconsumer():
r = ''
while
true:
n = yield r #
yield 後面的r是返回給呼叫者的值,yield前面的 n 用來接收呼叫者通過send函式傳過來的值
ifnot n: #
如果n是none,就結束該函式,因為none代表還沒有生產出來產品
print('
consumer即將結束')
return
print('
消費者正在消費%s...
' %n)
r = '
200 ok
'def
produce(c):
print('
send返回值為:
', c.send(none))
n =0
while n < 5:
n = n + 1
print('
生產者生產了%s...
' %n)
r = c.send(n) #
生產出來就去給消費者
print('
生產者接收消費者返回的資訊:%s
' %r)
c.close()
c =consumer()
produce(c)
結果:
send返回值為:生產者生產了1...
消費者正在消費1...
生產者接收消費者返回的資訊:200ok
生產者生產了2...
消費者正在消費2...
生產者接收消費者返回的資訊:200ok
生產者生產了3...
消費者正在消費3...
生產者接收消費者返回的資訊:200ok
生產者生產了4...
消費者正在消費4...
生產者接收消費者返回的資訊:200ok
生產者生產了5...
消費者正在消費5...
生產者接收消費者返回的資訊:200 ok
說明:整個過程無鎖,乙個執行緒使produce()和consumer()完成協作。
非同步Socket程式設計I
下面,用乙個例子來解釋同步通訊和非同步通訊的根本區別。假定乙個伺服器應用程式在指定埠監聽客戶端傳送來的資料。在同步通訊接收中,當伺服器等待從客戶端接收資料時,如果流沒有資料,那麼,主線程會阻塞,直到資料請求得到。因此,在這段時間,伺服器端不能進行任何工作,直到接收到該客戶端的資料。如果此時,另乙個客...
第18章非同步程式設計 isolate create
防採集標記 亢少軍老師的課程和資料 isolate create.dart檔案 import dart isolate import dart io void main 建立乙個新的isolate void create isolate asyncelse 處理耗時任務 接收乙個可以向主isolat...
i18n呼叫自己引數 I18N的前後端實現
所需工具 1 vue 2 vue i18n 前期設定 1 構建兩個json語言字典,如果就中英文切換就分別構建 string en.json 和string zh.json,格式如下 2 讀取前一步驟建立的字典,並構造vuei18n元素 獲取本地語言包 非同步獲取會沒有response,需要暫時關閉...