python 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
最近在用python完成项目上的一些小需求,我也是个Python新手,过程中遇到了一些问题,我把印象比较深的记录下来,希望能帮助到其他伙伴。
我用的是python 3.9.4, 我在centos上跑代码,也在windows上跑代码,这个问题是在windows上遇到的。我用的是windows10,我的场景是用python多线程向一个地址发送http请求获取数据,代码跑一会儿就会报错"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作"。
遇到这个问题的时候,我怀疑是python用的姿势不对,有一些资源没有关闭,然后我就一顿百度,我发现大家都在说可能是windows最大可用端口号的问题,windows最大可用端口号是5000,如果超过5000就会报这个错误。
同时我也查了一下python,我用的是urllib库和requests库,网上说python会自动释放资源,不需要干预。
本着听人劝吃饱饭的原则,我按照网上的说法修改了一下最大可用端口号,我是这样操作的
- 打开注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。
- 建一个DWORD项,名字为MaxUserPort,值为十进制65534(十六进制0000FFFE),表示最大可用端口为65534。
- 建一个DWORD项,名字为TCPTimedWaitDelay,值为十进制30(十六进制0000001e),表示TCP连接等待时间30秒。
改完之后我试了下,发现还是不好用,难道是我改的姿势不对!
我一顿查,最后找到了windows的老家,windows官方操作方法最后一条是这么说的
Exit Registry Editor, and then restart the computer.
哦,原来是我没重启电脑!我一阵兴奋,马上重启了一把,发现还是不好用。操作都是按照官方手册来的,为什么还是不好用呢!
我仔细思考了一下,我认为还是因为python使用的姿势不对,我重新把代码跑起来,在报错的时候,我使用这个命令查询了一下在windows上有多少个tcp链接,不查不知道,一查吓一跳,有1万多个。我使用的命令如下:
netstat -an | find /C “TCP”
那么问题很明显了,就是因为有资源没有关闭,可能是我python姿势不对,亦或是在大并发请求或者多线程或者一些我不知道的原因下,导致python的资源管理有某些问题。
我做了如下两个操作后,在跑代码就不会报错了,netstat查询出来的TCP链接维持在300上下。
第一个操作是使用session复用tcp链接
session = requests.Session()
response = session.get(url)
第二个是获取response.text之后,调用了关闭方法
response.close()
上文说的windows官方对最大可用端口号的说明在这: windows官方最大可用端口号说明
netstat的命令总结在这 windows命令总结
python常用的命令总结 python常用命令
另外我还有一些linux下常用的命令总结:linux常用命令
我会不时更新这些命令