电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

python 異步async庫的使用說明

瀏覽:7日期: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 編程
相關文章:
主站蜘蛛池模板: 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 压接机|高精度压接机|手动压接机|昆明可耐特科技有限公司[官网] 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 液压中心架,数控中心架,自定心中心架-烟台恒阳机电设计有限公司 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 考试试题_试卷及答案_诗词单词成语 - 优易学 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 书法培训-高考书法艺考培训班-山东艺霖书法培训凭实力挺进央美 | 北京成考网-北京成人高考网| 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 |