详细注释记录在代码中。。。
import httpx
import asyncio
import time
"""
httpx提供了Client来解决以上问题,Client是基于HTTP连接池实现的,
这意味着当你对一个网站发送多次请求的时候,Client会保持原有的TCP连接,从而提升程序的执行效率。
"""
"""
我们可以将headers、cookies、params等参数放在http.Client()中,在Client下的请求共享这些配置参数
可以看出,r1的请求头包含{'x-auth': 'from-client'}, r2虽然配置了headers2,
但由于里面的headers1和headers2的参数不同,Client会合并这两个headers的参数作为一个新的headers
(如果参数相同,则headers2的参数会覆盖headers1的参数)。
"""
"""
httpx可以通过设置proxies参数来使用http代理,我们也可以使用不同的代理来分别处理http和https协议的请求
httpx的代理参数proxies只能在httpx.Client()中添加,client.get()是没有这个参数的。
"""
"""
当请求https协议的链接时,发出的请求需要验证所请求主机的身份,因此需要SSL证书来取得服务器的信任后。
如果要使用自定义的CA证书,则可以使用verify参数
"""
"""
使用async/await语句来进行异步操作,创建一个httpx.AsyncClient()对象
"""
"""
检查 HTTP 版本
在客户端启用 HTTP/2 支持并不一定意味着您的请求和响应将通过 HTTP/2 传输,因为客户端 和服务器都需要支持 HTTP/2。
如果您连接到仅支持 HTTP/1.1 的服务器,则客户端将改为使用标准 HTTP/1.1 连接。
可以通过检查.http_version响应上的属性来确定使用了哪个版本的 HTTP 协议。
"""
"""
一个异步请求栗子
"""
async def req(client, i):
res = await client.get('https://www.example.com')
print(f'第{i + 1}次请求,status_code = {res.status_code}')
return res
async def main():
async with httpx.AsyncClient() as client:
task_list = []
for i in range(300):
res = req(client, i)
task = asyncio.create_task(res)
task_list.append(task)
await asyncio.gather(*task_list)
if __name__ == '__main__':
start = time.time()
asyncio.run(main())
end = time.time()
print(f'异步发送300次请求,耗时:{end - start}')
|