我的目标是要在很短的时间内用python发送尽可能多的请求(例如5秒钟内发送10000个请求)。
我正在使用asyncio和aiohttp,并且在两台计算机上运行完全相同的代码。一个是我的本地计算机,另一个是我的VPS。但是两台机器的结果是不同的:
问题是我的VPS中每秒的请求数量比我预期的要低得多。尽管VPS的互联网速度比我的家庭Internet连接快得多,但是在VPS上发送请求的速率并没有超过每秒300个,但是在我本地,我可以轻松地提高到每秒创建2000个请求。 VPS如此低的速度可能是什么原因?是因为软件还是硬件?我怎么知道服务器上的瓶颈?
我不在乎请求的结果。我只想在短时间内发送尽可能多的邮件,听起来vps创建协程的速度较慢。(我对请求进行计数的位置在下面的代码部分中显示。这些请求按原样计数创建的,而不是实际发送的时间)
本地
VPS
python 3.6.4用于本地和服务器。
我在本地和服务器上使用的代码结构如下:
import asyncio
import aiohttp
async def send_one():
async with sem:
try:
async with session.post(url=some_target_url,json=tmp_data,headers=headers) as resp:
# do some logging, result of request is not important to me
pass
except Exception as e:
print("Exception happened when sending request: "+str(e))
async def send_many():
tasks = []
sem = asyncio.Semaphore(limit_open_requests) # this number is high enough like 10000
delta_time= 1/number_of_requests_per_second # number of requests is 1000 for example
timeout = aiohttp.ClientTimeout(total=30) # unit is seconds
connector = aiohttp.TCPConnector(limit=0)
async with aiohttp.ClientSession(connector=connector,timeout=timeout) as session:
while True:
if some condition on timing:
break
#>>>>>>>
#>>>>>>> I log here the count and time of requests to measure the rate of sending them
#>>>>>>>
coro=send_one()
task = asyncio.ensure_future(coro)
tasks.append(task)
await asyncio.sleep(delta_time)
if len(tasks)!=0:
await asyncio.wait(tasks)
print('finished')
async_tasks = []
async_tasks.append( send_many() )
loop.run_until_complete(asyncio.wait(async_tasks))
-请注意,我不是从本地向vps发送请求。我正在从本地和vps发送到第三台服务器(例如“ http://google.com”)
使用aiohttp.TCPConnector(limit = 0)将aiohttp的请求数设置为无限制。
两台计算机中的大多数内存都可以免费使用,并且没有其他程序可以进行大量的网络工作。
将await asyncio.sleep(delta_time)
设置为await asyncio.sleep(0)
并没有太大区别。它只是改善了一点,与我在本地无法实现的目标相去甚远。 (例如,在vps上每秒处理400个请求,在本地计算机上每秒处理2000个请求)