Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这两个python异步IO代码示例之间的区别是什么?i';我试图理解为什么使用aiohttp而不是请求_Python_Python Requests_Python Asyncio_Aiohttp - Fatal编程技术网

这两个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