首页 > 编程问答 >使用 requests 包 python 时打开文件太多

使用 requests 包 python 时打开文件太多

时间:2024-07-21 02:56:21浏览次数:13  
标签:python python-requests

我正在使用 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])

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


错误“打开的文件太多”表明的程序打开了太多文件,并且没有关闭它们或同时打开了太多文件。虽然的代码包含关闭请求会话的机制,但有一些改进可以解决该问题并优化的代码:

  1. request 函数中删除 requests.Session() :无需为每个请求创建一个新会话。相反,请创建一个全局会话并在所有请求中重用它。这将减少创建和销毁过多会话的开销。

  2. 使用 multiprocessing.Pool 管理进程 multiprocessing.Pool 提供了一种管理多个进程的更好方法,包括在任务完成时自动关闭进程。

  3. 使用 with 语句进行进程管理 with 语句可以确保即使出现异常也能正确关闭资源(在本例中为进程)。

这是经过修改的代码:

import requests
import multiprocessing
import numpy as np
import time

# 全局会话
s = requests.Session()
s.keep_alive = False
url = "your_url"  # 用的实际 URL 替换

def request(args):
    i, mapId, minx, maxx, miny, maxy = args
    print(i)
    try:
        with s.post(
            url + "metadata/polygons",
            timeout=10,
            json={
                "mapId": mapId,
                "layer": "percelen",
                "xMin": minx,
                "xMax": maxx,
                "yMin": miny,
                "yMax": maxy,
            },
        ) as r:
            out = r.json()

    except Exception as e:
        print(f"出现错误:{e}")

if __name__ == "__main__":
    argsList = [(i, mapId, minx, maxx, miny, maxy) for i in np.arange(10000)] # 创建 argsList
    with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
        pool.map(request, argsList)

此代码首先创建一个全局会话 ( s ),该会话在所有请求中共享。然后,它定义了 request 函数,该函数现在接收一个参数元组,并使用全局会话发出请求。

主代码使用 multiprocessing.Pool 创建一个进程池。 Pool.map 方法用于将 request 函数并行应用于 argsList 中的每个参数集。 with 语句确保在池完成其工作后将其正确关闭,从而释放资源并防止“打开的文件太多”错误。

此改进后的代码应解决文件描述符泄漏并提高代码的整体效率。请记住根据的特定需求调整进程数。

标签:python,python-requests
From: 55230576

相关文章

  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......