午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術文章
文章詳情頁

python 異步async庫的使用說明

瀏覽:15日期:2022-07-26 14:00:40

在學習asyncio之前,先理清楚同步/異步的概念:

同步是指完成事務的邏輯,先執(zhí)行第一個事務,如果阻塞了,會一直等待,直到這個事務完成,再執(zhí)行第二個事務,順序執(zhí)行

異步是和同步相對的,異步是指在處理調用這個事務的之后,不會等待這個事務的處理結果,直接處理第二個事務去了,通過狀態(tài)、通知、回調來通知調用者處理結果

asyncio函數(shù):

異步IO采用消息循環(huán)的模式,重復“讀取消息—處理消息”的過程,也就是說異步IO模型”需要一個消息循環(huán),在消息循環(huán)中,主線程不斷地重復“讀取消息-處理消息”這一過程。

event_loop 事件循環(huán):程序開啟一個無限的循環(huán),程序員會把一些函數(shù)注冊到事件循環(huán)上。當滿足事件發(fā)生的時候,調用相應的協(xié)程函數(shù)。

coroutine 協(xié)程:協(xié)程對象,指一個使用async關鍵字定義的函數(shù),它的調用不會立即執(zhí)行函數(shù),而是會返回一個協(xié)程對象。協(xié)程對象需要注冊到事件循環(huán),由事件循環(huán)調用。

task 任務:一個協(xié)程對象就是一個原生可以掛起的函數(shù),任務則是對協(xié)程進一步封裝,其中包含任務的各種狀態(tài)。

async/await 關鍵字: 用于定義協(xié)程的關鍵字,async定義一個協(xié)程,await用于掛起阻塞的異步調用接口。

一、asyncio

下面通過舉例來對比同步代碼和異步代碼編寫方面的差異,其次看下兩者性能上的差距,使用asyncio.sleep(1)模擬耗時1秒的io操作。

同步代碼:

import timedef hello(): time.sleep(1)def run(): for i in range(5): hello() print(’Hello World:%s’ % time.time()) if __name__ == ’__main__’: run()Hello World:1536842494.2786784Hello World:1536842495.2796268Hello World:1536842496.2802596Hello World:1536842497.2804587Hello World:1536842498.2812462

異步代碼:

import timeimport asyncio# 定義異步函數(shù)async def hello(): print(’Hello World:%s’ % time.time()) #必須使用await,不能使用yield from;如果是使用yield from ,需要采用@asyncio.coroutine相對應 await asyncio.sleep(1) print(’Hello wow World:%s’ % time.time())def run(): tasks = [] for i in range(5): tasks.append(hello()) loop.run_until_complete(asyncio.wait(tasks))loop = asyncio.get_event_loop()if __name__ ==’__main__’: run()Hello World:1536855050.1950748Hello World:1536855050.1950748Hello World:1536855050.1950748Hello World:1536855050.1960726Hello World:1536855050.1960726(暫停約1秒)Hello wow World:1536855051.1993241Hello wow World:1536855051.1993241Hello wow World:1536855051.1993241Hello wow World:1536855051.1993241Hello wow World:1536855051.1993241

async def 用來定義異步函數(shù),其內部有異步操作。每個線程有一個事件循環(huán),主線程調用asyncio.get_event_loop()時會創(chuàng)建事件循環(huán),把異步的任務丟給這個循環(huán)的run_until_complete()方法,事件循環(huán)會安排協(xié)同程序的執(zhí)行。

上述程序中,hello()會首先打印出Hello world!,然后,yield from語法可以讓我們方便地調用另一個generator。

由于await asyncio.sleep(1)也是一個coroutine,所以線程不會等待asyncio.sleep(1),而是直接中斷并執(zhí)行下一個消息循環(huán)。

當asyncio.sleep(1)返回時,線程就可以從yield from拿到返回值(此處是None),然后接著執(zhí)行下一行語句。

把asyncio.sleep(1)看成是一個耗時1秒的IO操作,在此期間,主線程并未等待,而是去執(zhí)行EventLoop中其他可以執(zhí)行的coroutine了,因此可以實現(xiàn)并發(fā)執(zhí)行。

asyncio操作的總結:

async def hello(): 定義async異步函數(shù),中間可以添加await async.sleep(N) 來設定中斷并執(zhí)行下一個循環(huán)消息

tasks = [] 任務則是對協(xié)程進一步封裝,其中包含任務的各種狀態(tài)。即多個coroutine函數(shù)可以封裝成一組Task然后并發(fā)執(zhí)行

loop = asyncio.get_event_loop() #獲取“事件循環(huán)”對象

loop.run_until_complete(asyncio.wait(tasks)) #通過事件循環(huán),去調用協(xié)程函數(shù)

loop.close() 結束時間循環(huán)

二、aiohttp

如果需要并發(fā)http請求,通常是用requests,但requests是同步的庫,如果想異步的話需要引入aiohttp。

這里引入一個類,from aiohttp import ClientSession,首先要建立一個session對象,然后用session對象去打開網頁。

session可以進行多項操作,比如post, get, put, head等。

基本用法:

async with ClientSession() as session:

async with session.get(url) as response:

aiohttp異步實現(xiàn)的例子:

import asynciofrom aiohttp import ClientSessiontasks = []url = 'https://www.baidu.com/{}'async def hello(url): async with ClientSession() as session: async with session.get(url) as response: response = await response.read() print(response)if __name__ == ’__main__’: loop = asyncio.get_event_loop() loop.run_until_complete(hello(url))

首先async def 關鍵字定義了這是個異步函數(shù),await 關鍵字加在需要等待的操作前面,response.read()等待request響應,是個耗IO操作。然后使用ClientSession類發(fā)起http請求。

多鏈接異步訪問

如果我們需要請求多個URL該怎么辦呢,同步的做法訪問多個URL只需要加個for循環(huán)就可以了。但異步的實現(xiàn)方式并沒那么容易,在之前的基礎上需要將hello()包裝在asyncio的Future對象中,然后將Future對象列表作為任務傳遞給事件循環(huán)。

import timeimport asynciofrom aiohttp import ClientSessiontasks = []url = 'https://www.baidu.com/{}'async def hello(url): async with ClientSession() as session: async with session.get(url) as response: response = await response.read() print(’Hello World:%s’ % time.time())def run(): for i in range(5): task = asyncio.ensure_future(hello(url.format(i))) tasks.append(task)if __name__ == ’__main__’: loop = asyncio.get_event_loop() run() loop.run_until_complete(asyncio.wait(tasks))Hello World:1536843566.064149Hello World:1536843566.070586Hello World:1536843566.0769563Hello World:1536843566.0779328Hello World:1536843566.0799286

·收集http響應

好了,上面介紹了訪問不同鏈接的異步實現(xiàn)方式,但是我們只是發(fā)出了請求,如果要把響應一一收集到一個列表中,最后保存到本地或者打印出來要怎么實現(xiàn)呢,可通過asyncio.gather(*tasks)將響應全部收集起來

import timeimport asynciofrom aiohttp import ClientSessiontasks = []url = 'https://www.baidu.com/{}'async def hello(url): async with ClientSession() as session: async with session.get(url) as response:# print(response) print(’Hello World:%s’ % time.time()) return await response.read()def run(): for i in range(5): task = asyncio.ensure_future(hello(url.format(i))) tasks.append(task) result = loop.run_until_complete(asyncio.gather(*tasks)) print(result)if __name__ == ’__main__’: loop = asyncio.get_event_loop() run()Hello World:1536843488.678779Hello World:1536843488.6797836Hello World:1536843488.6867576Hello World:1536843488.6877556Hello World:1536843488.6877556

以上這篇python 異步async庫的使用說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: www啪啪| 诱惑の诱惑筱田优在线播放 | 色网站视频 | 亚洲jlzzjizz少妇| 色网站在线免费观看 | 日韩欧美v| 国产美女永久免费无遮挡 | 国产日韩一区二区 | 每日av在线 | 91麻豆影视 | 97色碰| 天天艹天天 | 草草国产 | 手机看片日韩在线 | 久久激情五月 | 国产午夜精品在线观看 | 免费av在线 | 六月丁香综合 | 97福利视频 | 中文字幕+乱码+中文字幕明步 | 国产精品二三区 | 亚洲精品aaa| 欧美日韩专区 | 天天操天天舔 | 欧美精品亚洲精品 | 欧洲亚洲一区二区 | 成人在线黄色 | 国产欧美高清 | 激情自拍偷拍 | 亚洲黄色网址 | 久久在线免费视频 | 91人人澡| 日韩精品专区 | 国产精品一区在线免费观看 | 日韩国产欧美视频 | 五月婷婷在线观看视频 | 亚洲三级久久 | 亚洲理论视频 | 日韩av一二三区 | 日本天堂在线播放 | 91大神福利视频 |