Python批量POST请求触发ConnectionError(WinError 10048)求助
WinError 10048 问题原因与解决方法
问题原因
Windows系统中,客户端发起TCP连接后,断开连接时套接字会进入TIME_WAIT状态(默认持续240秒),目的是确保网络中残留的数据包被正确处理。你的脚本短时间内发起了24000次POST请求,每次请求都会占用一个本地临时端口,用完后端口无法立即复用。当系统可用的临时端口被耗尽时,新的请求就会触发WinError 10048错误。
另外,当前代码每次调用requests.post()都会新建独立的TCP连接,没有复用连接池,进一步加快了端口占用的速度。
解决方法
1. 复用HTTP连接(推荐)
使用requests.Session()维护连接池,它会复用已建立的TCP连接,大幅减少端口占用。修改后的代码如下:
import requests url = "http://localhost:3100/api" payload = "test" with requests.Session() as session: # 40代表两个月的工作日 for _ in range(40): # 每天600条数据 for _ in range(600): session.post(url, data=payload)
2. 添加请求延迟
在每次请求后添加短暂延迟,给系统足够时间回收处于TIME_WAIT状态的端口。示例:
import requests import time url = "http://localhost:3100/api" payload = "test" with requests.Session() as session: for _ in range(40): for _ in range(600): session.post(url, data=payload) time.sleep(0.01) # 10毫秒延迟,可根据实际情况调整
3. 修改Windows TCP系统参数(进阶)
如果上述方法仍无法满足需求,可以修改系统注册表调整TCP参数:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 添加或修改以下DWORD值:
TcpTimedWaitDelay:设置为30(单位秒,缩短TIME_WAIT时长)MaxUserPort:设置为更大的值(比如65534,扩大临时端口范围)TcpNumConnections:根据需要调大允许的TCP连接数
修改后需要重启系统生效,注意这会影响整个系统的TCP行为,需谨慎操作。
内容的提问来源于stack exchange,提问作者M0ttii
相关产品推荐
相关产品推荐

