python進階之非同步任務
阿新 • • 發佈:2019-01-07
0.導語1.yield關鍵字2.非同步載入asyncio第一種方式第二種方式
python進階之非同步任務
0.導語
本文學習視訊來自莫凡python,下面是總結的學習內容。
關於星球,我在稍微闡述一點,我用自己的精力在星球中釋出小專案,釋出日打卡,共同來學習某一塊知識,所以改為收費模式,希望通過收費可以篩選出一波真正想學習的人,共同堅持,就像公眾號一樣,屹立不倒,昨天立了個flag,每日分享一條訊息或文字或技術,共同堅持學習!
更多幹貨分享加python程式語言學習QQ群 515267276
1.yield關鍵字yield類似於return,
但不同之處在於它返回的是生成器!
生成器
生成器是通過一個或多個yield表示式構成的函式。每一個生成器都是一個迭代器(但迭代器不一定是生成器)。
生成器並不會一次返回所有結果,而是每次遇到yield關鍵字後返回相應結果,並保留函式當前的執行狀態。等待下一次的呼叫。
由於生成器也是一個迭代器,那麼它就應該支援next方法來獲取下一個值。
除此之外,生成器還支援send函式,該函式可以向生成器傳遞引數。
# 基本操作 def fun(): for i in range(10): yield i f = fun() # 通過for迴圈+next進行呼叫 for i in range(10): print(next(f)) print('-----------------------------') def func(): n = 0 while 1: n = yield n f = func() print(next(f)) print('------------------------------') print(f.send(5)) # n賦值為5 def func(number): while True: yield number number += 1 f = func(1) print('------------------------------') # 取出10個數 for i in range(10): print(next(f)) # 生產消費模式 print('------------------------------') def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
2.非同步載入asyncio
asyncioasyncio可以實現單執行緒併發IO操作
async和await是針對coroutine的新語法,要使用新的語法,只需要做兩步簡單的替換:
把@asyncio.coroutine替換為async;
把yield from替換為await。
第一種方式
import asyncio @asyncio.coroutine def hello(): print("Hello world!") r = yield from asyncio.sleep(1) print("Hello again!") loop = asyncio.get_event_loop() loop.run_until_complete(hello()) loop.close()
第二種方式
更多幹貨分享加python程式語言學習QQ群 515267276
async def hello2(): print('Hello world2!') r = await asyncio.sleep(1) print('Hello again2!') loop = asyncio.get_event_loop() loop.run_until_complete(hello2()) loop.close()