这两个python异步IO代码示例之间的区别是什么?i';我试图理解为什么使用aiohttp而不是请求
我看到过这样一个代码示例:这两个python异步IO代码示例之间的区别是什么?i';我试图理解为什么使用aiohttp而不是请求,python,python-requests,python-asyncio,aiohttp,Python,Python Requests,Python Asyncio,Aiohttp,我看到过这样一个代码示例: import json import os import aiohttp import asyncio tokens = ['token1', 'token2', 'token3'] async def main(): async with aiohttp.ClientSession() as session: await asyncio.gather(*[exchange_token(session, i) for i in tokens
import json
import os
import aiohttp
import asyncio
tokens = ['token1', 'token2', 'token3']
async def main():
async with aiohttp.ClientSession() as session:
await asyncio.gather(*[exchange_token(session, i) for i in tokens])
async def exchange_token(session, refresh_token):
params={'grant_type':'refresh_token',
'refresh_token':refresh_token,
'client_secret':os.environ['CLIENT_SECRET'],
'client_id':os.environ['CLIENT_ID']}
async with session.post('https://test.com/token', data=params) as response:
jdata = await response.json()
print(jdata)
asyncio.run(main())
我不清楚为什么使用aiohttp而不是请求。这段使用请求的代码也可以使用,有人能给我解释一下区别,以及为什么第二个示例不能正确使用asyncio吗
import json
import os
import requests
import asyncio
tokens = ['token1', 'token2', 'token3']
async def main():
await asyncio.gather(*[exchange_token(i) for i in tokens])
async def exchange_token(refresh_token):
params={'grant_type':'refresh_token',
'refresh_token':refresh_token,
'client_secret':os.environ['CLIENT_SECRET'],
'client_id':os.environ['CLIENT_ID']}
response = await api_request(params)
jdata = json.loads(response.text)
print(jdata)
async def api_request(params):
response = requests.post('https://test.com/token', data=params)
return response
asyncio.run(main())
第二个示例的问题是它使用阻塞io库与外部HTTP服务器通信。在您的小示例中,向它发出3个请求的性能优势很小,因为非阻塞库可以并行地请求http服务器,因此处理3个令牌只需要最慢请求的时间。
aiohttp
是一个非阻塞版本,用于以更通用的方式在python中发出http请求,当您使用asyncio
时,您必须确保使用非阻塞版本的库来确保代码是非阻塞的,在您的情况下,请求
是一个阻塞库,TLDR:blocking-library使得asyncio的许多优点都被剥夺了,即协作多任务。一次只能运行一个东西,代码必须向其他代码提供执行权限,才能并行运行。请求不知道这个范例并占用线程,而aiohttp是协作的,可以在等待请求响应时向其他代码屈服。代码中的每一个等待
都是代码可能产生的“断点”;您会注意到,在请求代码中,在实际的昂贵请求调用中没有wait
。