0%

python | aiohttp 简介

简单的 aiphttp 介绍。

请求

session

普通使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import asyncio

import aiohttp


async def test():
async with aiohttp.ClientSession() as session:
async with session.get("http://www.baidu.com") as r:
status = r.status
print(status)


if __name__ == '__main__':
asyncio.run(test())

但是,利用 session 最大的好处就是,session 可以有效的降低网络请求时间「第一次连接成功后,如果是同一个域名的话,连接会非常快」

每次创建新的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import asyncio
import time

import aiohttp


async def test():
url = ["http://www.baidu.com"] * 30
start = time.time()
async with aiohttp.ClientSession() as session:
async with session.get("http://www.baidu.com") as r:
status = r.status
print(status)
print(time.time() - start)


if __name__ == '__main__':
asyncio.run(test())

输出是 2.3528871536254883

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import asyncio

import aiohttp
import time


async def test():
async with aiohttp.ClientSession() as session:
async with session.get("http://www.baidu.com") as r:
status = r.status
print(status)


if __name__ == '__main__':
start = time.time()
for i in range(30):
asyncio.run(test())
print(time.time() - start)

输出是

2.642192840576172

发现,每次创建新的 session 和不用 session 是一样的效果。

复用一个 session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import asyncio
import time

import aiohttp


async def get(session, url):
r = await session.get(url)
status = r.status
print(status)


async def test():
tasks = []
start = time.time()
session = aiohttp.ClientSession()
for i in range(30):
tasks.append(get(session, "http://www.baidu.com"))
await asyncio.wait(tasks)
await session.close()
print(time.time() - start)


if __name__ == '__main__':
asyncio.run(test())

输出 0.4676480293273926 ,发现速度明显的提高了。

但是,上面的方式显然不优雅。

请我喝杯咖啡吧~