如何为多处理池中的单个进程分配Python请求会话?

2024-04-23

考虑以下代码示例:

import multiprocessing
import requests

session = requests.Session()
data_to_be_processed = [...]

def process(arg):
    # do stuff with arg and get url
    response = session.get(url)
    # process response and generate data...
    return data

with multiprocessing.Pool() as pool:
    results = pool.map(process, data_to_be_processed)

例如,Session被分配为全局变量,因此在创建进程后Pool它将被复制到每个子流程中。我不确定会话是否是线程安全的,也不知道会话中的池化是如何工作的,所以我想为池中的每个进程分配单独的会话对象.

我知道,我可以使用requests.get(url)代替session.get(url),但我想使用 session 并且我也在考虑使用requests-html (https://html.python-requests.org/ https://html.python-requests.org/).

我对 python 的多处理不太熟悉,到目前为止我只使用了池,因为它对我来说是并行处理数据而没有关键部分的最佳解决方案,所以我对不同的解决方案持开放态度。

有没有一种方法可以干净、直接地做到这一点?


简短的回答:您可以使用全局命名空间在之间共享数据初始化器 and func:

import multiprocessing
import requests

session = None
data_to_be_processed = [...]

def init_process():
    global session
    session = requests.Session()

def process(arg):
    global session
    # do stuff with arg and get url
    response = session.get(url)
    # process response and generate data...
    return data

with multiprocessing.Pool(initializer=init_process) as pool:
    results = pool.map(process, data_to_be_processed)

长答案: Python 使用三种可能的方法之一启动方法 https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods。它们都将父进程和子进程之间的内存对象分开。在我们的例子中,这意味着运行的进程的全局命名空间发生变化Pool()不会传播回父进程,也不会传播回兄弟进程。

对于对象销毁,我们可以依靠垃圾收集器,它会在子进程完成其工作后介入。缺少显式关闭方法多处理.Pool()使得它不可能与不可被 GC 破坏的对象一起使用(例如Pool()本身 - 请参阅警告here https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool) 判断从请求文档 https://requests.readthedocs.io/en/master/user/advanced/#session-objects,使用起来完全没问题请求.Session没有明确的 close() 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为多处理池中的单个进程分配Python请求会话? 的相关文章

随机推荐

  • SQL Server 使用参数导致结果缓慢

    我有一个选择一些数据的查询 我在其中传递了一些参数 DECLARE FromAccDocNo INT 1 ToAccDocNo INT 999999999 FromDate CHAR 10 1900 01 01 ToDate CHAR 10
  • 如何设置像“YYYYMM”这样的 Postgresql 默认值日期戳?

    作为标题 如何将表的列设置为当前年份和月份的默认值 格式为 YYYYMM 例如今天的 200905 请记住 日期的格式与存储无关 如果您认为日期很重要stored在这种格式中 您需要定义自定义数据类型或将其存储为字符串 然后你可以使用组合e
  • 将 csv 列放入数组中

    我有一个带有列标题的 csv 描述 库存 mfgid 以及我不需要的其他一些标题 我需要从数组中的列标题 stock 和 mfgid 获取数据 我正在使用 fgetcsv 但它将整行放入数组中的独占键中 在 stackoverflow 上找
  • 如何将 Ruby 编译为 Javascript? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在研究一段逻辑 我想在服务器和浏览器中表达它 类似于验证表单 其中基于已输入的内容 元素之间必须存在某些逻辑关系 所以 如果我可以编写
  • 统一使用单例的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道哪种是使用单例实例的正确方法 当我创建一个名为 Manager 的单例类并且它包含一个名为 value 的 int 变量并且我有另一个名
  • 通过代理服务器访问HTTPS站点

    我正在添加代码以使用代理服务器访问互联网 从正常 HTTP 位置请求文件时 该代码可以正常工作 但在访问安全位置 HTTPS 时则不起作用 这是运行良好的代码 URL http UnSecureSite net file xml Dim w
  • Blob 转换:获取 xlsx 文件

    我正在尝试发送一封电子邮件 其中包含xlsx文件已附加 但我遇到的问题是 当我下载该文件时 该文件以 PDF 格式打开 这是我的代码 function sendMail var sheet SpreadsheetApp getActiveS
  • React Native 中无法读取 null 错误的属性“绑定”

    从反应本机运行应用程序时 我在模拟器 设备上收到以下错误消息 ERROR The development server returned response error code 500 URL http 10 0 2 2 8081 inde
  • 语义版本控制中 -rc 的含义是什么?

    我了解了 MAJOR MINOR PATCH 的逻辑 并且直观地了解了 semver 编号末尾的 alpha 和 beta 的含义 但 rc 并没有给我敲响任何警钟 在那里找不到满意的答案 gt https semver org https
  • 基于带有图标的列的数据表搜索[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一个带有状态列的数据表 我正在考虑提供搜索图标的可能性 因此 如果有人在搜索框中键入 打开 它应该显示带有 打开 图标的所有
  • 在 Windows 上安装 Pinax

    我可以安装吗Pinax http pinaxproject com 在 Windows 环境下 有简单的方法吗 您推荐哪种环境 我安装了 pinax 0 7rc1 并在 Windows 7 上运行 没有任何问题 请观看此视频 了解如何执行此
  • 更改文本字体大小以适应浏览器语言翻译时的 div 容器,而不是在视口更改上[重复]

    这个问题在这里已经有答案了 NOTE 这与响应视口更改的字体更改不同 IE 字体大小 3 2vw 纯 CSS 使字体大小根据动态字符数量进行响应 https stackoverflow com questions 14431411 pure
  • Pandas:删除重复索引的所有记录

    我有一个数据集 其中可能包含重复的标识符记录appkey 理想情况下 重复的记录不应该存在 因此我认为它们是数据收集错误 我需要删除一个的所有实例appkey这种情况发生不止一次 The drop duplicates方法在这种情况下没有用
  • 在 Jetty 中运行的 Grails 在没有布局模板的情况下呈现 404 错误页面

    我有一个 Grails 2 0 1 应用程序 我设置了以下 UrlMapping controller home 500 view error serverError 404 view error notFound 这是我的 notFoun
  • 如何在AWS中获取EC2实例的arn

    如何获取AWS中ec2实例的arn 我正在尝试使用资源标签 api 将标签添加到 EC2 实例 资源标签 api 需要所有资源的 arn 我如何获取它 您可以自己 构建 它 arn aws ec2
  • 如何将 UIImage 旋转 90 度?

    我有一个UIImage那是UIImageOrientationUp 纵向 我想逆时针旋转 90 度 横向 我不想使用CGAffineTransform 我想要的像素UIImage实际转移位置 我正在使用一段代码 如下所示 最初旨在调整UII
  • 如何停止优化器丢弃未使用的变量?

    我想调试我的代码 但无法访问进程中的内部层 因为这会干扰与硬件的通信 在监视列表会干扰基本读取访问的情况下执行易失性操作 因此 我正在测试接口的返回值 但 IAR 编译器甚至会优化未使用的易失性变量 和这样的声明 i object foo
  • Openlayers 3 中的拖放功能

    OpenLayers 2 OpenLayers Control DragFeature 功能的等效项是什么 我需要向地图添加一个可以用鼠标移动的图标 当掉落时我需要捕捉事件 在 OpenLayers 2 中 描述的功能是 new OpenL
  • Tableau - 计算日期小于另一个数据源的值的平均值

    我正在尝试计算 Tableau 中列的平均值 但问题是我正在尝试使用来自另一个数据源的单个日期值 基于筛选器 来仅计算考试日期 注意 参数在这里对我不起作用 因为新的日期值不断添加到集合中 我尝试了许多不同的方法 但最简单的方法是尝试使用计
  • 如何为多处理池中的单个进程分配Python请求会话?

    考虑以下代码示例 import multiprocessing import requests session requests Session data to be processed def process arg do stuff w