您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python async模塊如何使用”,在日常操作中,相信很多人在Python async模塊如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python async模塊如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
協(xié)程:協(xié)程(Coroutine),也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。簡而言之,其實就是通過一個線程實現(xiàn)代碼塊相互切換執(zhí)行
Python對協(xié)程的支持是通過generator實現(xiàn)的。
在generator中,我們不但可以通過for循環(huán)來迭代,還可以不斷調(diào)用next()函數(shù)獲取由yield語句返回的下一個值。 但是Python的yield不但可以返回一個值,它還可以接收調(diào)用者發(fā)出的參數(shù)。
在Python中,這種一邊循環(huán)一邊計算的機制,稱為生成器:generator。通過給定一個算法然后在調(diào)用的過程中計算真實值。
當(dāng)需要從generator中獲取值的時候可以使用next(),但是一般使用for循環(huán)進行獲取。
generator的實現(xiàn)方式 生成器,使用()表示
如:[1, 2, 3, 4, 5],生成器方法:
data = [1, 2, 3, 4, 5] (x * x for x in len(data))
函數(shù)定義在一些邏輯復(fù)雜的場景下,使用第一種方法不太合適,因此存在類型函數(shù)定義的方式,如:
def num(x): while (x < 10): print(x * x) x += 1 g = num(1) for item in g: print(item)
當(dāng)函數(shù)中出現(xiàn)yield的時候,此時就成為generator
def num(x): while (x < 10): yield x * x # 返回結(jié)果,下次從這個地方繼續(xù)? x += 1 g = num(1) # 返回的是generator對象 for item in g: print(item)
變成generator的函數(shù),在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行。
異步io通過事件循環(huán)和協(xié)程函數(shù)實現(xiàn)
事件循環(huán)即不斷監(jiān)察內(nèi)部的任務(wù),如果存在則執(zhí)行;任務(wù)分為可執(zhí)行和正在執(zhí)行;由事件循環(huán)決定處理任務(wù),如果任務(wù)列表為空,事件終止。
import asyncio # 生成或獲取事件循環(huán)對象loop;類比Java的Netty,我理解為開啟一個selector loop = asyncio.get_event_loop() # 將協(xié)程函數(shù)(任務(wù))提交到事件循環(huán)的任務(wù)列表中,協(xié)程函數(shù)執(zhí)行完成之后終止。 # run_until_complete 會檢查協(xié)程函數(shù)的運行狀態(tài),并執(zhí)行協(xié)程函數(shù) loop.run_until_complete( func() )
test demo
import asyncio import time async def test(): print("io等待") await asyncio.sleep(1) return 'hello' async def hello(): print("Hello world") r = await test() print("hello again") loop = asyncio.get_event_loop() tasks = [hello(), hello()] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
協(xié)程函數(shù):由 async def 修飾的函數(shù);相比于普通的def, 如 def func(),可以直接接收到函數(shù)返回的值;但是對于協(xié)程函數(shù)返回的是一個協(xié)程對象。
想要運行協(xié)程函數(shù),需要將這個對象交給事件循環(huán)進行處理。
# 測試協(xié)程 import asyncio import time, datetime # 異步函數(shù)不同于普通函數(shù),調(diào)用普通函數(shù)會得到返回值 # 而調(diào)用異步函數(shù)會得到一個協(xié)程對象。我們需要將協(xié)程對象放到一個事件循環(huán)中才能達到與其他協(xié)程對象協(xié)作的效果 # 因為事件循環(huán)會負(fù)責(zé)處理子程 序切換的操作。 async def Print(): return "hello" loop = asyncio.get_event_loop() loop.run_until_complete(Print)
await:
用法:reponse = await + 可等待對象
可等待對象: 協(xié)程對象, Future, Task對象 可理解為IO等待
response : 等待的結(jié)果 await 遇到IO操作會掛起當(dāng)前協(xié)程(任務(wù)),當(dāng)前協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他協(xié)程(任務(wù)) 注意:可等待對象若是協(xié)程對象則變成串行,若是Task對象則并發(fā)運行 Task對象,可以在事件循環(huán)列表中添加多個任務(wù)??梢酝ㄟ^**asyncio.create_task(協(xié)程對象)**的方式創(chuàng)建Task對象
import asyncio import time, datetime async def display(num): pass tasks = [] for num in range(10): tasks.append(display(num)) # 生成任務(wù)列表 loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks))
asnyc和await是新語法,舊版本為:@asyncio.coroutine 和 yield from
asyncio可以實現(xiàn)單線程并發(fā)IO操作。如果僅用在客戶端,發(fā)揮的威力不大。如果把asyncio用在服務(wù)器端,例如Web服務(wù)器,由于HTTP連接就是IO操作,因此可以用單線程+coroutine實現(xiàn)多用戶的高并發(fā)支持。
aiohttp則是基于asyncio實現(xiàn)的HTTP框架。
可以類似requests發(fā)送請求 get請求
可以通過params參數(shù)來指定要傳遞的參數(shù)
async def fetch(session): async with session.get("http://localhost:10056/test/") as response: data = json.loads(await response.text()) print(data["data"])
post請求
異步的執(zhí)行兩個任務(wù)
在網(wǎng)絡(luò)請求中,一個請求就是一個會話,然后aiohttp使用的是ClientSession來管理會話
使用session.method發(fā)送請求
對于響應(yīng)信息response, 通過status來獲取響應(yīng)狀態(tài)碼,text()來獲取到響應(yīng)內(nèi)容;可以在text()指定編碼格式。 在response.text()前面添加await表示等待響應(yīng)結(jié)果
async def init(num): async with aiohttp.ClientSession() as session: if num == 1: time.sleep(5) print("session begin", num) async with session.post("http://localhost:10056/hello/", data=json.dumps({"data": "hello"})) as response: print("client begin", num) data = json.loads(await response.text()) print(data["data"]) print("session end", num) print("other") if __name__ == '__main__': loop = asyncio.get_event_loop() tasks = [init(1), init(2)] loop.run_until_complete(asyncio.wait(tasks))
到此,關(guān)于“Python async模塊如何使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。