日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

python 異步async庫的使用說明

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

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

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

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

asyncio函數:

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

event_loop 事件循環:程序開啟一個無限的循環,程序員會把一些函數注冊到事件循環上。當滿足事件發生的時候,調用相應的協程函數。

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

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

async/await 關鍵字: 用于定義協程的關鍵字,async定義一個協程,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# 定義異步函數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 用來定義異步函數,其內部有異步操作。每個線程有一個事件循環,主線程調用asyncio.get_event_loop()時會創建事件循環,把異步的任務丟給這個循環的run_until_complete()方法,事件循環會安排協同程序的執行。

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

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

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

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

asyncio操作的總結:

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

tasks = [] 任務則是對協程進一步封裝,其中包含任務的各種狀態。即多個coroutine函數可以封裝成一組Task然后并發執行

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

loop.run_until_complete(asyncio.wait(tasks)) #通過事件循環,去調用協程函數

loop.close() 結束時間循環

二、aiohttp

如果需要并發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異步實現的例子:

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 關鍵字定義了這是個異步函數,await 關鍵字加在需要等待的操作前面,response.read()等待request響應,是個耗IO操作。然后使用ClientSession類發起http請求。

多鏈接異步訪問

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

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響應

好了,上面介紹了訪問不同鏈接的異步實現方式,但是我們只是發出了請求,如果要把響應一一收集到一個列表中,最后保存到本地或者打印出來要怎么實現呢,可通過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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品亚洲综合在线观看| 欧美一级一区| 欧美日一区二区三区在线观看国产免| 日韩和的一区二在线| 亚洲不卡视频| 91中文字幕精品永久在线| 日韩有吗在线观看| 亚洲一区日韩在线| 欧美日韩精品一区二区视频| 黄色网一区二区| 国产区精品区| 亚洲深深色噜噜狠狠爱网站 | 亚洲综合在线电影| 精品免费av| 国产黄色一区| 国产另类在线| 日本va欧美va精品| 在线免费观看亚洲| 免费久久99精品国产自在现线| 水蜜桃精品av一区二区| 国产精品最新| 日韩精品一区二区三区av | 里番精品3d一二三区| 亚洲精品字幕| 亚洲黄色在线| 欧美日韩中文一区二区| 日韩欧美综合| 久久精品免费一区二区三区| 日韩一区电影| 精品久久免费| 日韩av二区| 成人国产精品一区二区免费麻豆| 国产精品免费精品自在线观看| 日韩高清在线不卡| 欧美一级一区| 蜜桃久久久久| 欧美日一区二区三区在线观看国产免 | 亚洲精品成人一区| 视频一区二区不卡| 亚洲免费激情| 亚洲天堂av资源在线观看| 亚洲国产成人精品女人| 1024精品久久久久久久久| 在线成人动漫av| 精品在线99| 国产麻豆综合| 亚欧洲精品视频在线观看| 亚洲一二av| 亚洲资源av| 日韩毛片网站| 国产极品久久久久久久久波多结野| 久久超级碰碰| 丰满少妇一区| 久久天堂成人| 五月天久久777| 日韩精品一级中文字幕精品视频免费观看 | 成人啊v在线| 亚洲大片在线| 中文字幕一区二区三区在线视频| 日韩高清一区二区| 日韩精品免费视频人成| 国产乱码精品一区二区三区四区| 国产午夜精品一区在线观看| 美女久久久精品| 久久婷婷一区| 日韩在线观看一区二区| 日韩成人精品一区二区三区| 国产精品白丝久久av网站| 久久久久97| 国产精品久久久久av电视剧| 国产视频一区欧美| 国产欧美一区| 久久精品午夜| 欧美激情另类| 亚洲欧美日韩国产综合精品二区 | 国产精品88久久久久久| 免费视频一区二区| 国产欧美亚洲精品a| 国产精品1区在线| 久久久久蜜桃| 亚洲永久精品唐人导航网址| 国产三级一区| 久久久久欧美精品| 老牛影视一区二区三区| 国产探花一区| 日韩成人精品一区二区| 尤物在线精品| 国产欧美日韩精品一区二区免费 | 伊人久久成人| 午夜性色一区二区三区免费视频| 欧美日韩1区| 久久久精品五月天| 69堂精品视频在线播放| av一区在线| 国产日韩一区二区三区在线| 精品国产亚洲日本| 免费黄网站欧美| 日韩精品电影| 亚洲精品少妇| 亚洲大全视频| 三级精品视频| 97精品一区二区| 国产精品红桃| 亚洲日本在线观看视频| 国产精品7m凸凹视频分类| 日韩国产激情| 国产91在线播放精品| 国产日产精品_国产精品毛片| 先锋亚洲精品| 欧美午夜精品一区二区三区电影| 成人国产精品一区二区网站| 日本一区二区中文字幕| 99视频一区| 精精国产xxxx视频在线野外| 国产中文欧美日韩在线| 久久99偷拍| 国产精品v日韩精品v欧美精品网站| 日韩激情网站| 日精品一区二区三区| 亚洲久久一区| 日本一区中文字幕| 日韩av影院| 久久精品xxxxx| 国产精品videossex久久发布| 91p九色成人| 日韩国产欧美三级| 91成人在线网站| 国产免费av国片精品草莓男男| 日本在线不卡视频| 少妇高潮一区二区三区99| 亚洲日本国产| 日韩成人午夜精品| 欧美私人啪啪vps| 国产乱人伦精品一区| 国产精品一区二区三区av| 国产毛片一区二区三区 | 日韩久久99| 国产日韩在线观看视频| 欧美亚洲自偷自偷| 欧美激情日韩| 中文字幕在线视频网站| 欧美二三四区| 99久久99久久精品国产片果冰| 欧美日韩一区二区综合| 日韩视频中文| 亚洲精品在线a| 国产精品视频一区二区三区四蜜臂| 久久99精品久久久久久园产越南 | a日韩av网址| 久久九九99| 好看的亚洲午夜视频在线| 免费在线看一区| 欧美午夜三级| 风间由美中文字幕在线看视频国产欧美| 国产精品久久久久久久免费观看 | 国产精品99一区二区| 亚洲欧美视频一区二区三区| 亚洲色图综合| 日韩高清国产一区在线| 国产伦精品一区二区三区千人斩 | 亚洲在线久久| 国产剧情一区| 日韩一区亚洲二区| 国产精品社区| 日韩福利视频网| 美女精品久久| 亚洲网站视频| 日韩av一区二区在线影视| 精品国产亚洲一区二区三区大结局| 91精品韩国| 中文字幕成人| 乱一区二区av| 亚洲精华国产欧美| 国产日韩欧美一区二区三区在线观看| 福利一区和二区| 欧美日韩国产在线观看网站| 日韩欧美中文字幕在线视频| 国产第一亚洲| 亚洲一区亚洲| 欧美激情视频一区二区三区免费| 91精品国产福利在线观看麻豆| 亚洲精品欧美| 日本а中文在线天堂| 综合亚洲色图| 激情黄产视频在线免费观看| 丝袜a∨在线一区二区三区不卡| 国产精品综合色区在线观看| 国产综合激情| 国产精久久久| 国产一区导航| 美女视频黄 久久| 快she精品国产999| 日韩1区2区| 日本中文字幕一区二区视频| 免费看av不卡| 国产欧美自拍| 亚洲欧美日韩专区| 亚洲欧洲高清| 国产欧美三级| 日韩中文字幕区一区有砖一区|