在Python中实现并发发送上千个GET请求,可以使用以下方法:
方法一:使用多线程
使用`threading`模块创建多个线程,每个线程负责发送一个请求。可以使用`concurrent.futures.ThreadPoolExecutor`来管理和控制线程池的大小。
```python
import threading
import requests
from concurrent.futures import ThreadPoolExecutor
def send_request(url):
response = requests.get(url)
print(response.text)
urls = ['http://example.com'] * 1000 假设这里有1000个URL
with ThreadPoolExecutor(max_workers=100) as executor: 设置最大线程数
executor.map(send_request, urls)
方法二:使用协程
使用`asyncio`模块和`aiohttp`库实现并发请求。协程是一种轻量级的线程,可以在单个线程中实现并发。
```python
import asyncio
import aiohttp
async def send_request(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return response.status
async def main():
tasks = [send_request(url) for url in urls]
responses = await asyncio.gather(*tasks)
print(responses)
asyncio.run(main())
注意事项
线程数设置:
线程数不宜设置过高,否则可能会导致系统资源耗尽。通常,线程数设置为可用CPU核心数的1-2倍即可。
并发数限制:
对于高并发请求,服务器可能会有限制,例如HTTP/1.1协议下,同一连接内最多只能有6个请求。可以通过设置`HTTPConnectionPool`的`max_connections`参数来调整。
错误处理:
实际应用中,应该添加错误处理逻辑,以应对网络请求失败或其他异常情况。
性能测试:
在实施并发策略之前,建议先进行性能测试,以确定最佳的并发数配置。
请根据您的具体需求和环境选择合适的方法。