簡體   English   中英

使用請求包python時打開的文件太多

[英]Too many open files when using requests package 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 套接字並因此占用文件描述符這一事實。

第一個解決方案:

使用帶有自定義HTTPAdapter的單個Session實例並將增強的參數傳遞給它的pool_connections參數。

旁注1:您不需要調用s.close() 當上下文管理器調用.__exit__()時,它已經被調用了。

旁注 2:考慮使用threadingasyncio / 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

我認為第二個解決方案可以描述為“解決症狀而不是問題”,但如果你必須並且感到大膽,請嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM