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()