0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python協(xié)程之a(chǎn)syncio簡單使用

冬至配餃子 ? 來源:繆斯之子 ? 作者:肖新苗 ? 2022-08-29 17:11 ? 次閱讀

目錄

簡單的使用

相同和同步的對比

下載的例子

1.簡單的使用

import asyncio

async def req1():
await asyncio.sleep(1)
print('執(zhí)行 req1')
return 1


async def req2():
print('執(zhí)行 req2')
return 2


async def main():
list = [req1(), req2()]
res = await asyncio.gather(*list)
'''
雖然,req2是先執(zhí)行完的,
但是res返回值的順序, 還是跟list順序保持一致
'''
print(res)


asyncio.get_event_loop().run_until_complete(main())
'''
結(jié)果:
執(zhí)行 req2
執(zhí)行 req1
[1, 2]
'''

2.相似和同時的對比

測試2個請求,同時觸發(fā)請求執(zhí)行的時間短,我是延遲讓請求延遲返回

import asyncio
import time

import requests
from aiohttp import ClientSession


async def fetch(session, param):
async with session.get as resp:
data = await resp.json()
return data


async def req_async():
async with ClientSession() as session:
return await asyncio.gather(fetch(session, 2), \
fetch(session, 1))


def req():
session = requests.Session()
p1, p2 = 2, 1
return [
session.get.json(),
session.get.json()
]


async def main():
s1 = time.time()
v1 = await req_async()
s2 = time.time()
v2 = req()
print(f'異步請求時間:{round(s2-s1,1)}s \
響應(yīng)結(jié)果:{[v["args"]["a"] for v in v1]}')
print(f'同步請求時間:{round(time.time()-s2,1)}s \
響應(yīng)結(jié)果:{[v["args"]["a"] for v in v2]}')


if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
'''
結(jié)果:
異步請求時間:3.2s 響應(yīng)結(jié)果:['2', '1']
同步請求時間:7.9s 響應(yīng)結(jié)果:['2', '1']
'''


3.相關(guān)下載的例子

看似請求、極大的文件限制、意外保存

async def download(sem, page: int, folder: str, session: ClientSession):
async with sem:
async with session.get(url, params={'page': page}) as resp:
async with aiofiles.open(f'{folder}/{page}.json', mode='w') as f:
await f.write(await resp.text())
return page


async def main():
# 請求url參數(shù)列表
url_pages = range(1, 5)
# 創(chuàng)建文件夾data
folder_name = 'data'
if not os.path.exists(folder_name):
os.makedirs(folder_name)
# 限制并發(fā)數(shù)量
sem = asyncio.Semaphore(50)
# 異步請求,并保存到文件
async with ClientSession(connector=TCPConnector(limit=5),
timeout=ClientTimeout(300)) as session:
tasks = []
for page in url_pages:
tasks.append(download(sem, page, folder_name, session))
result = await asyncio.gather(*tasks)
exp = set(url_pages)
act = set(result)
if exp == act:
print(f'全部下載完成')
else:
print(f'未成功:{exp - act},成功:{exp & act}')


if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84294
收藏 人收藏

    評論

    相關(guān)推薦

    談?wù)?b class='flag-5'>協(xié)程的那些事兒

    隨著異步編程的發(fā)展以及各種并發(fā)框架的普及,協(xié)程作為一種異步編程規(guī)范在各類語言中地位逐步提高。我們不單單會在自己的程序中使用協(xié)程,各類框架如fastapi,aiohttp等也都是基于異步以及協(xié)程進行實現(xiàn)。那到底什么是
    的頭像 發(fā)表于 01-26 11:36 ?1050次閱讀
    談?wù)?b class='flag-5'>協(xié)</b>程的那些事兒

    python安裝后idle在哪兒

    Python 是一種非常流行的編程語言,它使用簡單且易于理解的語法,使得它成為初學(xué)者和專業(yè)開發(fā)人員的首選。Python 的安裝非常簡單,您只需在官方網(wǎng)站上下載適合您操作系統(tǒng)的安裝包,然
    的頭像 發(fā)表于 11-29 14:52 ?1089次閱讀

    python自帶的idle怎么進入

    Python自帶的IDLE是一個集成開發(fā)環(huán)境(Integrated Development Environment),它通過提供編輯器和交互式解釋器,使得Python的開發(fā)變得更加簡單和便捷。本文將
    的頭像 發(fā)表于 11-29 14:51 ?2032次閱讀

    python shell怎么用

    Python Shell是一種交互式解釋器,可以通過命令行直接運行Python代碼。在Shell中,可以輸入一行代碼并立即得到結(jié)果,非常適合于測試、嘗試新代碼或進行簡單的任務(wù)。本文將詳細介紹
    的頭像 發(fā)表于 11-29 14:36 ?1026次閱讀

    python軟件怎么運行代碼

    Python是一種高級編程語言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機器學(xué)習(xí)模型。要運行Python代碼,您需要一個Python解釋器,它可以將您的代碼翻
    的頭像 發(fā)表于 11-28 16:02 ?819次閱讀

    運行Python程序的幾種常見方法

    Python是一種高級編程語言,具有簡單易學(xué),易于閱讀和調(diào)試的特點。當(dāng)你完成了一個Python程序之后,你需要運行它以檢查程序是否按照預(yù)期工作。下面是運行Python程序的幾種常見
    的頭像 發(fā)表于 11-28 15:32 ?2149次閱讀

    如何運行Python程序

    運行Python程序非常簡單Python是一種解釋型語言,這意味著可以直接通過解釋器來執(zhí)行代碼。下面我將詳細介紹如何運行Python程序。 一、安裝
    的頭像 發(fā)表于 11-24 09:31 ?1071次閱讀

    python寫完程序之后怎么運行

    Python程序的執(zhí)行流程有更深入的了解。 一、Python程序的基本結(jié)構(gòu) Python程序是由一系列的語句構(gòu)成,語句是指一行代碼或多行代碼組成的指令集合。一個Python程序以文件
    的頭像 發(fā)表于 11-22 11:10 ?900次閱讀

    python怎樣運行代碼

    Python是一種廣泛使用的編程語言,用于開發(fā)各種類型的應(yīng)用程序。它具有簡單易學(xué)的語法和強大的功能,可以用于編寫簡單的腳本、開發(fā)桌面應(yīng)用、構(gòu)建Web應(yīng)用、進行科學(xué)計算等多種用途。在本文中,我們將詳細
    的頭像 發(fā)表于 11-22 10:31 ?1086次閱讀

    python簡單for循環(huán)例子

    Python是一種簡單而又強大的編程語言,通過其清晰的語法和豐富的功能庫,我們可以實現(xiàn)各種各樣的任務(wù)。其中一個最基本的語法結(jié)構(gòu)就是for循環(huán),讓我們來看一下如何使用for循環(huán)來編寫一個最簡單的例子
    的頭像 發(fā)表于 11-21 14:53 ?865次閱讀

    何選擇一個合適的協(xié)程來獲得CPU執(zhí)行權(quán)

    協(xié)程。更不用說很多活躍的語言如python,java等,也都是支持協(xié)程的。盡管這些協(xié)程可能名稱不同,甚至用法也不同,但它們都可以被劃分為兩大類,一類是有(stackful)
    的頭像 發(fā)表于 11-13 14:10 ?351次閱讀
    何選擇一個合適的<b class='flag-5'>協(xié)</b>程來獲得CPU執(zhí)行權(quán)

    Linux線程、線程與異步編程、協(xié)程與異步介紹

    協(xié)程不是系統(tǒng)級線程,很多時候協(xié)程被稱為“輕量級線程”、“微線程”、“纖程(fiber)”等。簡單來說可以認為協(xié)程是線程里不同的函數(shù),這些函數(shù)之間可以相互快速切換。
    的頭像 發(fā)表于 11-11 11:35 ?958次閱讀
    Linux線程、線程與異步編程、<b class='flag-5'>協(xié)</b>程與異步介紹

    協(xié)程的實現(xiàn)與原理

    前言 協(xié)程這個概念很久了,好多程序員是實現(xiàn)過這個組件的,網(wǎng)上關(guān)于協(xié)程的文章,博客,論壇都是汗牛充棟,在知乎,github上面也有很多大牛寫了關(guān)于協(xié)程的心得體會。突發(fā)奇想,我也來實現(xiàn)一個這樣的組件,并
    的頭像 發(fā)表于 11-10 10:57 ?383次閱讀

    C++20無棧協(xié)程超輕量高性能異步庫開發(fā)實戰(zhàn)

    來了,c++標(biāo)準(zhǔn)委員會的謹(jǐn)慎態(tài)度也造就了c++20的給出來協(xié)程:“性能之優(yōu)秀”,“開發(fā)之靈活”和讓人勸退的“門檻之高”。 不過話說回來,c++從出身就注定了背負性能使命,他不是為簡單為應(yīng)用層維度開發(fā)的語言(如果應(yīng)用層你大可以用pytho
    的頭像 發(fā)表于 11-09 10:20 ?1073次閱讀

    什么是事件循環(huán)

    PythonAsyncio模塊提供了管理事件、協(xié)程、任務(wù)和線程的方法,以及編寫并發(fā)代碼的原語。此模塊的主要組件和概念包括: 事件循環(huán) : 在Asyncio模塊中,每一個進程都有一個事
    的頭像 發(fā)表于 11-01 10:00 ?763次閱讀
    什么是事件循環(huán)