Python Demo18 非同步IO之協程

2022-07-02 14:06:10 字數 3010 閱讀 6793

協程是通過generator來實現的,就是yield關鍵字和send()函式的使用。

yield關鍵字可以將值(資訊)返回,同時在資訊返回後使程式停留在當前行。

>>> def

test():

... 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前面的變數來接收傳遞過來的值。

>>> def

tst():

... 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()函式再應用於生成器就會提示生成器已停止的資訊

>>> def

test():

... 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()傳入值了。

def

consumer():

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,需要暫時關閉...