成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Python異步編程進(jìn)行API調(diào)用

開(kāi)發(fā) 后端
本文中,將向大家介紹如何使用Python異步編程,以便您可以更快地進(jìn)行更多的API調(diào)用。那么讓我們開(kāi)始吧。

[[395712]]

本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。  

本文中,將向大家介紹如何使用Python異步編程,以便您可以更快地進(jìn)行更多的API調(diào)用。那么讓我們開(kāi)始吧。

請(qǐng)求庫(kù)

通常,當(dāng)Python使用者希望進(jìn)行API調(diào)用時(shí),他們會(huì)尋找請(qǐng)求庫(kù)。語(yǔ)法是我最喜歡的語(yǔ)法,因?yàn)槿绻蚁脒M(jìn)行API調(diào)用,則可以運(yùn)行:

  1. import requests 
  2. response = requests.get("http://example.com/"
  3. print(response) 

現(xiàn)在,可以做一個(gè)for循環(huán):

  1. import requests 
  2. for i in range(10): 
  3.     response = requests.get("http://example.com/"
  4.     print(response) 

每次我對(duì)進(jìn)行API調(diào)用時(shí)example.com,我都必須完成:

  • 將請(qǐng)求發(fā)送至example.com。
  • 等待回應(yīng)。
  • 得到回應(yīng)。

如果想試圖獲取大量數(shù)據(jù)(例如,如果我想從Alpha Vantage API中提取fintech數(shù)據(jù)),您則需要一個(gè)可以設(shè)置的免費(fèi)密鑰api_key = your_key_here。

  1. import requests 
  2. import os 
  3. api_key = os.getenv('ALPHAVANTAGE_API_KEY'
  4. url = 'https://www.alphavantage.co/query?function=OVERVIEW&symbol={}&apikey={}' 
  5. symbols = ['AAPL''GOOG''TSLA''MSFT''PEP'
  6. results = [] 
  7. for symbol in symbols: 
  8.      response = requests.get(url.format(symbol, api_key)) 
  9.      results.append(response.json()) 

此時(shí)必須等待大約1.5秒才能進(jìn)行5個(gè)API調(diào)用,然后需要11秒才能進(jìn)行50個(gè)API調(diào)用,需要50秒才能進(jìn)行135個(gè)API調(diào)用……

如果您想獲得2,000家公司或1600萬(wàn)種顏色的數(shù)據(jù),我們需要做一些擴(kuò)展。

異步代碼與同步代碼

當(dāng)我們運(yùn)行Python代碼時(shí),我們的過(guò)程一行一行地讀取代碼。在執(zhí)行一行時(shí),沒(méi)有其他代碼可以運(yùn)行。這就是所謂的同步代碼-依次進(jìn)行的所有操作。

在異步代碼中,我們可以在完成一項(xiàng)任務(wù)之前繼續(xù)執(zhí)行另一項(xiàng)任務(wù)。例如,如果我們考慮同步烹飪漢堡和蔬菜晚餐,我們的“代碼”將如下所示:

  1. cook_burger() 
  2. cook_vegetables() 

在這種情況下,因?yàn)闈h堡是同步的,所以我們要等漢堡完成后才能開(kāi)始蔬菜。但我們并不總是希望等到漢堡做完之后才能開(kāi)始烹飪蔬菜。因此我們可以同時(shí)煮。一旦完成,我們就可以停止處理成品蔬菜或漢堡的任何工作。在異步代碼中,它看起來(lái)像這樣:

  1. async def cook_meal(): 
  2.      await asyncio.gather(cook_burger(), cook_vegetables()) 
  3. asyncio.run(cook_meal()) 

我們“收集”我們將要完成的任務(wù),并await讓它們都完成。我們?cè)谑录h(huán)中運(yùn)行它們,以跟蹤完成后如何處理它們。您可以不斷檢查看看其中一個(gè)過(guò)程是否完成,從而想到事件循環(huán)。

現(xiàn)在您可能已經(jīng)聽(tīng)說(shuō)過(guò)多線程,并且它們是不同的,多線程用于擁有多個(gè)工作程序,而異步只有一名工人。

事件循環(huán)

回到我們的Alpha Vantage API調(diào)用示例。現(xiàn)在,在我們的代碼中:

  • 發(fā)出第一個(gè)請(qǐng)求。
  • 等待。
  • 得到第一反應(yīng)。
  • 發(fā)出第二個(gè)請(qǐng)求。
  • 等待。
  • 得到第二個(gè)答復(fù)。

如果我們有五個(gè)符號(hào),我們將“等待”五次。那么我們需要代替執(zhí)行此操作,啟動(dòng)一個(gè)API調(diào)用,然后啟動(dòng)其他API調(diào)用,最后再處理響應(yīng)。

另外,除了執(zhí)行上述操作之外,我們還可以:

  • 發(fā)出第一個(gè)請(qǐng)求。
  • 發(fā)出第二個(gè)請(qǐng)求。
  • 等待。
  • 得到第一反應(yīng)。
  • 得到第二個(gè)答復(fù)。

在第二個(gè)示例中,我們只有一個(gè)等待時(shí)間!當(dāng)返回響應(yīng)時(shí)(可能在我們發(fā)出請(qǐng)求時(shí)發(fā)生),因此我們需要一些處理返回的響應(yīng)的方法,這被稱為事件循環(huán)。

事件循環(huán)會(huì)定期檢查以查看我們的異步操作是否已返回,并安排它們進(jìn)行相應(yīng)的處理。當(dāng)我們正常運(yùn)行Python時(shí),沒(méi)有運(yùn)行任何事件循環(huán)來(lái)處理該事件,因此我們需要設(shè)置事件循環(huán),以便可以按順序處理響應(yīng)。

然后,我們可以異步運(yùn)行我們的代碼。

輸入asyncio和aiohttp

我們現(xiàn)在知道,當(dāng)我們異步運(yùn)行代碼時(shí),我們無(wú)須等待代碼操作完成,我們可以使用asyncio和aiohttp來(lái)進(jìn)行操作。

  1. import asyncio 
  2. import aiohttp 
  3. import os 
  4. import time 
  5. api_key = os.getenv('ALPHAVANTAGE_API_KEY'
  6. url = 'https://www.alphavantage.co/query?function=OVERVIEW&symbol={}&apikey={}' 
  7. symbols = ['AAPL''GOOG''TSLA''MSFT''PEP'
  8. results = [] 
  9. async def get_symbols(): 
  10.     async with aiohttp.ClientSession() as session: 
  11.         for symbol in symbols: 
  12.             response = await session.get(url.format(symbol, api_key), ssl=False
  13. asyncio.run(get_symbols()) 

分解

我們將使用asyncio.run(get_symbols()),這會(huì)促使事件循環(huán)的啟動(dòng),并且會(huì)允許我們使用異步代碼。

此時(shí)您會(huì)注意到,在以往許多的示例中,它們?nèi)绾螁?dòng)事件循環(huán)會(huì)更加明確:

  1. loop = asyncio.get_event_loop() 
  2. results = loop.run_until_complete(get_symbols()) 
  3. loop.close() 

此代碼塊的作用與asyncio.run(get_symbols())完全相同,那是我們的切入點(diǎn)。然后我們轉(zhuǎn)到函數(shù):

  1. async def get_symbols(): 
  2.     async with aiohttp.ClientSession() as session: 
  3.         for symbol in symbols: 
  4.             response = await session.get(url.format(symbol, api_key), ssl=False

我們必須從async關(guān)鍵字開(kāi)始,這使Python知道此函數(shù)將是異步的,并且我們可以使用事件循環(huán)。

我們將展開(kāi)一個(gè)會(huì)話aiohttp,aiohttp是異步版本requests。

我們按照相同的方式進(jìn)行操作,并調(diào)用aiohttp版本的request.get(即session.get),此處需要添加內(nèi)容ssl=False。

由于session.get是異步函數(shù)(也稱為協(xié)程),因此我們必須await做出響應(yīng),否則它們會(huì)返回協(xié)程本身。

現(xiàn)在我們已經(jīng)請(qǐng)求代碼復(fù)制為異步語(yǔ)法,此時(shí)我們依然需要等待。

收集任務(wù)

我們即將要啟動(dòng)所有API調(diào)用。

  1. import asyncio 
  2. import aiohttp 
  3. import os 
  4. import time 
  5. api_key = os.getenv('ALPHAVANTAGE_API_KEY'
  6. url = 'https://www.alphavantage.co/query?function=OVERVIEW&symbol={}&apikey={}' 
  7. symbols = ['AAPL''GOOG''TSLA''MSFT''PEP'
  8. results = [] 
  9. def get_tasks(session): 
  10.     tasks = [] 
  11.     for symbol in symbols: 
  12.         tasks.append(session.get(url.format(symbol, api_key), ssl=False)) 
  13.     return tasks 
  14. async def get_symbols(): 
  15.     async with aiohttp.ClientSession() as session: 
  16.         tasks = get_tasks(session) 
  17.         responses = await asyncio.gather(*tasks) 
  18. asyncio.run(get_symbols()) 

我們有一個(gè)名為的全新功能get_tasks。此功能將所有協(xié)同程序合并到一個(gè)列表中,以便我們立即啟動(dòng)。請(qǐng)記住,此列表中的所有函數(shù)都必須是異步函數(shù)或已放置在事件隊(duì)列中的任務(wù)。

我們還可以通過(guò)以下方式獲得所有任務(wù):

  1. tasks = [session.get(URL.format(symbol, API_KEY), ssl=Falsefor symbol in symbols] 

在得到要啟動(dòng)的功能/任務(wù)的列表后,我們可以get_symbols使用以下命令在功能中將它們?nèi)繂?dòng):

  1. responses = await asyncio.gather(*tasks) 

我們將等待所有任務(wù)完成并將它們放入responses對(duì)象中。

  1. responses = await asyncio.gather(session.get(URL.format('IBM', API_KEY), ssl=False), session.get(URL.format('AAPL', API_KEY), ssl=False), session.get(URL.format('MSFT', API_KEY), ssl=False)) 

因?yàn)?tasks只是將列表解引用為變量的一種方法。

我們“收集”所有任務(wù)并將其運(yùn)送出去,當(dāng)它們響應(yīng)時(shí),事件循環(huán)將它們拾取,并在我們交付所有任務(wù)后將它們放入要處理的隊(duì)列中。

協(xié)程與任務(wù)

在上面的示例中,我們向asyncio.gather函數(shù)傳遞了異步協(xié)程列表,以便可以將它們調(diào)度到事件循環(huán)中,實(shí)際上可以更快地將它們調(diào)度到事件循環(huán)中!

在我們的get_tasks函數(shù)中,我們調(diào)用了:

  1. tasks.append(session.get(url.format(symbol, api_key), ssl=False)) 

我們將該session.get函數(shù)添加到了任務(wù)列表中,并且僅在調(diào)用時(shí)將它們添加到了事件循環(huán)中g(shù)ather。實(shí)際上,您可以使用asyncio.create_task以下命令更快地將其添加到事件循環(huán)中:

  1. tasks.append(asyncio.create_task(session.get(url.format(symbol, api_key), ssl=False))) 

這會(huì)將session.get函數(shù)添加到事件循環(huán)中,并且asyncio.gather函數(shù)將等待該任務(wù)完成。

請(qǐng)記住它們的不同之處。協(xié)程是函數(shù),而任務(wù)則是在事件循環(huán)中安排的任務(wù)。asyncio.gather將等待任務(wù)返回和/或?qū)f(xié)程安排到事件循環(huán)中,并等待它們返回。

 

責(zé)任編輯:武曉燕 來(lái)源: 區(qū)塊鏈研究實(shí)驗(yàn)室
相關(guān)推薦

2023-04-12 08:00:00

人工智能ChatGPTPython

2024-02-07 11:44:20

NestJSRxJS異步編程

2015-09-16 15:11:58

C#異步編程

2009-11-09 10:50:30

WCF異步調(diào)用

2018-04-16 09:42:25

編程顏色ncurses

2010-02-22 10:06:17

Python調(diào)用

2018-09-08 09:25:05

編程語(yǔ)言PythonVS Code

2018-10-10 14:21:06

Python 工具程序員

2023-08-02 08:03:08

Python線程池

2010-01-18 17:14:50

C++語(yǔ)言

2009-12-07 14:35:42

WCF異步調(diào)用

2019-09-12 18:10:38

HTTPieAPI測(cè)試Python

2013-04-01 15:38:54

異步編程異步編程模型

2010-02-02 14:11:14

Python 進(jìn)行編程

2021-03-22 08:45:30

異步編程Java

2020-10-15 12:00:01

Python 開(kāi)發(fā)編程語(yǔ)言

2021-02-22 13:44:41

開(kāi)發(fā)Python金融

2010-03-15 15:45:15

Python編程語(yǔ)言

2020-06-30 08:23:00

JavaScript開(kāi)發(fā)技術(shù)

2010-06-04 13:50:24

MySQL存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www日日日 | 免费观看黄| 国产成人精品久久久 | 精品国产欧美一区二区三区成人 | 女人牲交视频一级毛片 | 国产精品视频在线播放 | 国产精品视频在线播放 | 成人午夜免费福利视频 | 手机看黄av免费网址 | av成人在线观看 | 国产成人啪免费观看软件 | 欧美a级成人淫片免费看 | 精品一区二区三区在线视频 | 伊人超碰 | 91免费入口 | 国产精品不卡 | 亚洲国产精品一区二区久久 | 欧美一级片在线观看 | 国产免费高清 | 欧美亚洲国产成人 | 欧美啊v在线观看 | 中文字幕在线观看视频一区 | 色综合久久天天综合网 | 精品久久久久一区二区国产 | 黄色片大全在线观看 | 天天干 夜夜操 | 宅女噜噜66国产精品观看免费 | 精品一二区| 欧美寡妇偷汉性猛交 | 综合色站导航 | 四虎在线观看 | 黄色在线观看网址 | 成人久久久久久久久 | 国产精品揄拍一区二区久久国内亚洲精 | 蜜臀av日日欢夜夜爽一区 | 成人久久18免费网站麻豆 | 国产欧美精品一区二区三区 | 亚洲成人在线免费 | 国产精品久久久久永久免费观看 | 精品国产欧美日韩不卡在线观看 | 久久国产精品久久久久久 |