国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 異步async庫(kù)的使用說(shuō)明

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

在學(xué)習(xí)asyncio之前,先理清楚同步/異步的概念:

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

異步是和同步相對(duì)的,異步是指在處理調(diào)用這個(gè)事務(wù)的之后,不會(huì)等待這個(gè)事務(wù)的處理結(jié)果,直接處理第二個(gè)事務(wù)去了,通過(guò)狀態(tài)、通知、回調(diào)來(lái)通知調(diào)用者處理結(jié)果

asyncio函數(shù):

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

event_loop 事件循環(huán):程序開(kāi)啟一個(gè)無(wú)限的循環(huán),程序員會(huì)把一些函數(shù)注冊(cè)到事件循環(huán)上。當(dāng)滿足事件發(fā)生的時(shí)候,調(diào)用相應(yīng)的協(xié)程函數(shù)。

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

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

async/await 關(guān)鍵字: 用于定義協(xié)程的關(guān)鍵字,async定義一個(gè)協(xié)程,await用于掛起阻塞的異步調(diào)用接口。

一、asyncio

下面通過(guò)舉例來(lái)對(duì)比同步代碼和異步代碼編寫(xiě)方面的差異,其次看下兩者性能上的差距,使用asyncio.sleep(1)模擬耗時(shí)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相對(duì)應(yīng) 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 用來(lái)定義異步函數(shù),其內(nèi)部有異步操作。每個(gè)線程有一個(gè)事件循環(huán),主線程調(diào)用asyncio.get_event_loop()時(shí)會(huì)創(chuàng)建事件循環(huán),把異步的任務(wù)丟給這個(gè)循環(huán)的run_until_complete()方法,事件循環(huán)會(huì)安排協(xié)同程序的執(zhí)行。

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

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

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

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

asyncio操作的總結(jié):

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

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

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

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

loop.close() 結(jié)束時(shí)間循環(huán)

二、aiohttp

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

這里引入一個(gè)類(lèi),from aiohttp import ClientSession,首先要建立一個(gè)session對(duì)象,然后用session對(duì)象去打開(kāi)網(wǎng)頁(yè)。

session可以進(jìn)行多項(xiàng)操作,比如post, get, put, head等。

基本用法:

async with ClientSession() as session:

async with session.get(url) as response:

aiohttp異步實(shí)現(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 關(guān)鍵字定義了這是個(gè)異步函數(shù),await 關(guān)鍵字加在需要等待的操作前面,response.read()等待request響應(yīng),是個(gè)耗IO操作。然后使用ClientSession類(lèi)發(fā)起http請(qǐng)求。

多鏈接異步訪問(wèn)

如果我們需要請(qǐng)求多個(gè)URL該怎么辦呢,同步的做法訪問(wèn)多個(gè)URL只需要加個(gè)for循環(huán)就可以了。但異步的實(shí)現(xiàn)方式并沒(méi)那么容易,在之前的基礎(chǔ)上需要將hello()包裝在asyncio的Future對(duì)象中,然后將Future對(duì)象列表作為任務(wù)傳遞給事件循環(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響應(yīng)

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

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庫(kù)的使用說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 一级欧美激情毛片 | 国产成人一区二区三区影院免费 | 在线黄网 | 日韩免费一级毛片欧美一级日韩片 | 香蕉福利久久福利久久香蕉 | 大片毛片女女女女女女女 | 亚洲天堂视频在线免费观看 | 国产一区二区三区在线免费观看 | 欧美三级在线视频 | 久青草免费视频 | 国产精品三级国语在线看 | 亚洲人视频在线观看 | 亚洲精品99久久久久中文字幕 | 欧美特级另类xxx | 在线精品日韩一区二区三区 | 草草视频免费观看 | 国产成人亚洲精品2020 | 精品国产乱码久久久久久一区二区 | 国产小毛片 | 免费日韩一级片 | 手机毛片在线观看 | 久久99精品久久只有精品 | 孕妇xxxx视频在线 | 国产成人亚洲精品2020 | 成人亚洲精品一区 | 亚洲字幕 | 国产一区二区在线视频播放 | 欧美亚洲黄色 | 一级视频网站 | 手机在线看片国产日韩生活片 | 欧美成人精品在线 | 动漫精品一区二区 | 中文在线亚洲 | 色拍拍在精品视频69影院在线 | 久久久久久久岛国免费观看 | 精品精品国产欧美在线观看 | 怡红院在线视频观看 | 九九视频免费在线观看 | 国产精品久久国产三级国电话系列 | 国产激情视频在线 | 欧美日本高清 |