在python中组合异步和同步请求?
我试图向服务器a发出请求,其中的响应将是一个请求列表,我将向服务器B发出请求 当前对服务器A的请求只是一个简单的同步请求,如下所示:在python中组合异步和同步请求?,python,http,asynchronous,request,Python,Http,Asynchronous,Request,我试图向服务器a发出请求,其中的响应将是一个请求列表,我将向服务器B发出请求 当前对服务器A的请求只是一个简单的同步请求,如下所示: import requests req = requests.get('https://server-a.com') data = req.json() list_of_requests = data['requests'] # requests for server B 由于list\u of_requests的长度可能只有几千项,因此我想使用async来
import requests
req = requests.get('https://server-a.com')
data = req.json()
list_of_requests = data['requests'] # requests for server B
由于list\u of_requests
的长度可能只有几千项,因此我想使用async来加速对B的请求
我已经看过几个使用aiohttp的异步HTTP请求示例,例如
然而,我看到的所有示例都是从已经定义的请求列表开始的。我的问题是,组合单个同步请求,然后使用该请求“生成”异步任务的正确python方式/模式是什么
非常感谢
import aiohttp
import asyncio
import os
from aiohttp import ClientSession
GOOGLE_BOOKS_URL = "https://www.googleapis.com/books/v1/volumes?q=isbn:"
LIST_ISBN = [
'9780002005883',
'9780002238304',
'9780002261982',
'9780006163831',
'9780006178736',
'9780006280897',
'9780006280934',
'9780006353287',
'9780006380832',
'9780006470229',
]
def extract_fields_from_response(response):
"""Extract fields from API's response"""
item = response.get("items", [{}])[0]
volume_info = item.get("volumeInfo", {})
title = volume_info.get("title", None)
subtitle = volume_info.get("subtitle", None)
description = volume_info.get("description", None)
published_date = volume_info.get("publishedDate", None)
return (
title,
subtitle,
description,
published_date,
)
async def get_book_details_async(isbn, session):
"""Get book details using Google Books API (asynchronously)"""
url = GOOGLE_BOOKS_URL + isbn
try:
response = await session.request(method='GET', url=url)
response.raise_for_status()
print(f"Response status ({url}): {response.status}")
except HTTPError as http_err:
print(f"HTTP error occurred: {http_err}")
except Exception as err:
print(f"An error ocurred: {err}")
response_json = await response.json()
return response_json
async def run_program(isbn, session):
"""Wrapper for running program in an asynchronous manner"""
try:
response = await get_book_details_async(isbn, session)
parsed_response = extract_fields_from_response(response)
print(f"Response: {json.dumps(parsed_response, indent=2)}")
except Exception as err:
print(f"Exception occured: {err}")
pass
async with ClientSession() as session:
await asyncio.gather(*[run_program(isbn, session) for isbn in LIST_ISBN])