python - 使用请求包python时打开的文件太多
问题描述
我正在使用 Python requests 包向 API 发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确地关闭我的会话时,我真的不知道这是怎么回事。
我使用以下代码:
import requests
import multiprocessing
import numpy as np
s = requests.session()
s.keep_alive = False
def request(i, mapId, minx, maxx, miny, maxy):
print(i)
try:
with requests.Session() as s:
r = s.post(
url + "metadata/polygons",
timeout=10,
json={
"mapId": mapId,
"layer": "percelen",
"xMin": minx,
"xMax": maxx,
"yMin": miny,
"yMax": maxy,
},
)
out = r.json()
s.close()
except:
print("something went wrong with: " + str(i))
for i in np.aragne(10000):
time.sleep(1)
multiprocessing.Process(target=request, args=argsList[i])
任何帮助或见解将不胜感激,因为我没有想法。
解决方案
“打开的文件太多”可能是指每个Session
及其单个 POST 请求都占用 TCP 套接字并因此占用文件描述符这一事实。
第一个解决方案:
使用带有自定义的单个Session
实例并将增强的参数传递给其参数。HTTPAdapter
pool_connections
旁注1:您不需要调用s.close()
. 当上下文管理器调用.__exit__()
.
旁注2:考虑使用threading
or asyncio
/ aiohttp
。对于像这样的 IO 绑定任务,多处理并不理想。
第二种解决方案:
增加允许打开的文件数。在 Linux 上,您需要执行以下操作:
sudo vim /etc/security/limits.conf
# Add these lines
root soft nofile 100000
root hard nofile 100000
ubuntu soft nofile 100000
ubuntu hard nofile 100000
sudo vim /etc/sysctl.conf
# Add this line
fs.file-max = 2097152
sudo sysctl -p
sudo vim /etc/pam.d/commmon_session
# Add this line
session required pam_limits.so
sudo reboot
我认为第二种解决方案可以被描述为“解决症状而不是问题”,但是如果您必须并且感觉大胆,请尝试一下。
推荐阅读
- mysql - 在 SQL 中查询派生表的平均值
- javascript - 设置跨度的 .text() (多次使用)
- python - 货币python bot不保存在json中
- python - 过滤或删除 json 文件中的一些字典
- openshift - docker hub image pull openshift codereddy 上发生的错误
- automated-tests - 引诱报告生成带有 0 个测试用例的报告
- python - 获取列中值的日期时间索引
- rust - 是否可以在 Rust 中删除包含原始值的变量?
- windows - 执行批处理文件时除以零错误
- python - 将列表插入同一列表时的省略号