首页 > 解决方案 > 使用请求包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])

任何帮助或见解将不胜感激,因为我没有想法。

标签: pythonpython-requests

解决方案


“打开的文件太多”可能是指每个Session及其单个 POST 请求都占用 TCP 套接字并因此占用文件描述符这一事实。

第一个解决方案:

使用带有自定义的单个Session实例并将增强的参数传递给其参数。HTTPAdapterpool_connections

旁注1:您不需要调用s.close(). 当上下文管理器调用.__exit__().

旁注2:考虑使用threadingor 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

我认为第二种解决方案可以被描述为“解决症状而不是问题”,但是如果您必须并且感觉大胆,请尝试一下。


推荐阅读