set() 可以在 Python 进程之间共享吗?

2024-05-08

我正在 Python 2.7 中使用多重处理来处理非常大的数据集。当每个进程运行时,它会将整数添加到共享的 mp.Manager.Queue() 中,但前提是其他进程尚未添加相同的整数。由于您无法对队列进行“in”式成员资格测试,因此我这样做的方法是检查共享 mp.Manager.list() 中每个 int 的成员资格。该列表最终将有约 3000 万个条目,因此成员资格测试将极其缓慢,从而抵消了多处理的优势。

这是我正在做的事情的简化版本:

import multiprocessing as mp

def worker(shared_list, out_q, lock):
    # Do some processing and get an integer
    result_int = some_other_code()

    # Use a lock to ensure nothing is added to the list in the meantime
    lock.acquire()
    # This lookup can take forever when the list is large
    if result_int not in shared_list:
        out_q.put(result_int)
        shared_list.append(result_int)
    lock.release()

manager = mp.Manager()
shared_list = manager.list()
lock = manager.lock()
out_q = manager.Queue()

for i in range(8):
   p = mp.Process(target=worker, args=(shared_list, out_q, lock))
   p.start()

我之前尝试使用 set() 而不是 mp.Manager.list(),但似乎每个进程都有自己的内存空间,因此当我更新集合时,它没有跨进程同步。因此,我转向了当前的方法。

以下是我之前尝试使用 set() 的大致方式: 将多处理导入为 mp

def worker(shared_set, out_q, lock):
    # Do some processing and get an integer
    result_int = some_other_code()

    # Use a lock to ensure nothing is added to the set in the meantime
    lock.acquire()
    # This lookup is fast, but the set doesn't reflect additions made by other processes.
    if result_int not in shared_set:
        out_q.put(result_int)
        shared_set.add(result_int)
    lock.release()

manager = mp.Manager()
lock = manager.lock()
out_q = manager.Queue()

# This set will NOT synchronize between processes
shared_set = set()


for i in range(8):
   p = mp.Process(target=worker, args=(shared_set, out_q, lock))
   p.start()

注意:这些示例未经测试,仅代表我的代码的相关部分。

有没有办法跨进程共享集,或者以其他方式进行更快的成员资格查找?

编辑: 更多信息:out_q 由另一个将数据写入单个输出文件的进程使用。不能有重复项。如果我生成一个整数并且发现它是重复的,则该过程需要返回并生成下一个最佳整数。


一个明显的调整是使用mp.Manager.dict()而不是集合,并使用任意值(例如,集合the_dict[result_int] = 1以指示集合中的成员资格)。顺便说一句,这就是在 Python 添加之前“每个人”实现集合的方式set类型,甚至现在字典和集合也是通过基本相同的代码在幕后实现的。

稍后添加:我承认我不明白为什么您在原始代码中同时使用集合和列表,因为集合的键与列表的内容相同。如果输入顺序并不重要,为什么不完全忘记该列表呢?然后,您还可以删除原始版本中所需的锁定层,以保持集合和列表同步。

通过 dict 建议来充实它,整个函数将变得像这样:

def worker(shared_dict):
    # Do some processing and get an integer
    result_int = some_other_code()
    shared_dict[result_int] = 1

其他进程可以做shared_dict.pop()然后一次获取一个值(虽然,不,他们等不及.pop()就像他们对队列所做的那样.get()).

还有一件事:考虑使用本地(进程本地)集吗?他们会跑得更快。那么每个worker就不会添加任何重复项it知道,但可能有重复across流程。您的代码没有给出任何关于什么的提示out_q消费者确实如此,但如果只有一个,那么其中的本地集也可以清除跨进程重复项。或者也许内存负担变得太重了?无法从这里猜测;-)

BIG EDIT

我将建议一种不同的方法:不要使用mp.Manager根本不。大多数时候我看到人们使用它,他们会后悔,因为它没有做他们想要的事情think它正在做。他们的想法是:它提供物理共享对象。它在做什么:它正在供应语义上共享对象。从物理上讲,它们生活在“又一个”中,在幕后,对对象的进程和操作被转发到后一个进程,由该进程在其自己的地址空间中执行。它不是身体上的完全共享。因此,虽然它非常方便,但即使是最简单的操作也会产生大量的进程间开销。

因此,我建议在一个进程中使用单个普通集,这将是与清除重复项有关的唯一代码。工作进程生成整数而不关心重复 - 它们只是传递整数。一个mp.Queue对此很好(同样,不需要mp.Manager.Queue).

像这样,这是一个完整的可执行程序:

N = 20

def worker(outq):
    from random import randrange
    from time import sleep
    while True:    
        i = randrange(N)
        outq.put(i)
        sleep(0.1)

def uniqueifier(inq, outq):
    seen = set()
    while True:
        i = inq.get()
        if i not in seen:
            seen.add(i)
            outq.put(i)

def consumer(inq):
    for _ in range(N):
        i = inq.get()
        print(i)

if __name__ == "__main__":
    import multiprocessing as mp
    q1 = mp.Queue()
    q2 = mp.Queue()
    consume = mp.Process(target=consumer, args=(q2,))
    consume.start()
    procs = [mp.Process(target=uniqueifier, args=(q1, q2))]
    for _ in range(4):
        procs.append(mp.Process(target=worker, args=(q1,)))
    for p in procs:
        p.start()
    consume.join()
    for p in procs:
        p.terminate()

第二个队列传递给uniqueifier扮演原始队列的角色:它仅提供唯一的整数。不会尝试“共享内存”,因此不会支付由此产生的任何费用。唯一的进程间通信是通过简单、显式的mp.Queue运营。只有一组,并且由于它不以任何方式共享,因此它运行得尽可能快。

实际上,这只是设置了一个简单的管道,尽管有多个输入。

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

set() 可以在 Python 进程之间共享吗? 的相关文章

  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • 无法在 PowerShell 中完全解析 XML

    我有一个 XML 文件 我想解析该文件并检索特定信息 为了便于理解 下面是 XML 文件的屏幕截图 我想解析 XML 并为每个Item节点 检索屏幕截图中指示的字段 检索到的每个值都需要针对每个项目节点进行格式化 最后 我希望能够指定一个要
  • Ctrl-退格键 Visual Studio 2010

    I recently upgraded to Visual Studio 2010 and found out that when I press Ctrl Backspace on an empty line it will delete
  • Python ttk.combobox 强制发布/打开

    我正在尝试扩展 ttk 组合框类以允许自动建议 我到目前为止的代码运行良好 但我想让它在输入一些文本后显示下拉列表 而不从小部件的输入部分移除焦点 我正在努力解决的部分是找到一种强制下拉的方法 在 python 文档中我找不到任何提及这一点
  • Spring Data、JPA @OneToMany Lazy fetch 在 Spring Boot 中不起作用

    I have OneToMany之间的关系FabricRoll and FabricDefect OneToMany cascade CascadeType ALL fetch FetchType LAZY JoinColumn name
  • Google 的新地点库(实现“com.google.android.libraries.places:1.0.0”)无法解析

    我正在尝试迁移到新的 Places SDK 客户端 但我被告知要安装的依赖项文档 https developers google com places android sdk client migration给我一个 无法解决 错误 我确保
  • Python Subversion 包装器库

    在颠覆的文档 http svnbook red bean com en 1 7 svn developer usingapi html svn developer usingapi otherlangs有一个从 Python 使用 Subv
  • 为什么吐司消息在 Marshmallow 6.0.1 中不显示,而低于 6.0 则显示

    我正在使用 toast 消息传递 Toast 消息的显示远低于 Marshmallow 6 0 但对于 Marshmallow 6 0 和 6 Toast 未显示 推送通知也未显示 请解决这个问题 对于吐司 Toast makeText c
  • 经典 asp 和 IIS 应用程序池之间有什么关系?

    asp 是否在为其配置网站的 IIS 应用程序池中运行 或者应用程序池仅适用于asp NET应用程序 这两者之间有何关系 我需要知道什么才能了解 谁在做什么以及他们在哪里做 ASP Classic 应用程序将在分配给它的应用程序池中运行 A
  • 自动化 RStudio 处理 RMarkdown?

    我有一个 RMarkdown 文件 用于生成漂亮的 HTML 报告 问题是 我希望能够自动化它 以便它可以在无头服务器上运行 因此 不会有人启动 Rstudio 并按下 knithtml 按钮 而且 Rstudio 似乎正在做很多额外的魔法
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 计算分组序列中两个值之间的差异

    这是这篇文章的后续问题 循环遍历 R 中的数据帧并测量两个值之间的时间差 https stackoverflow com questions 44885856 loop through dataframe in r and measure
  • 为什么每次合并分支后我的 git log graph 都会多增长一行?

    我习惯使用git log oneline graph decorate all作为别名git ll在终端中查看提交图表 但是当我每次合并我的时 一个问题让我感到困惑develop to master 上面命令的输出可能是这样的 0d1bf7
  • WritePrivateProfileString 未在末尾添加属性

    我正在使用以下命令在 ini 文件中写入一些属性WritePrivateProfileString函数并且一切正常 但是当我添加多行文本时 出现了问题 这是代码和输出 WritePrivateProfileString T General
  • 通过 JavaScript 获取页面/iframe 的编码

    我想通过 JavaScript 或浏览器中的其他一些 API 以编程方式确定页面的编码 我想要这些信息的原因是因为我试图对主要浏览器支持的字符编码进行模糊测试 显然仅仅因为我发送了适当的 内容类型 并不意味着浏览器会使用编码做正确的事情 欢
  • 如何通过MFC将应用程序设置保存到注册表中?

    我有一个由 MFC 项目向导创建的 MFC 应用程序 我想在注册表中保存 读取应用程序设置 所以问了这个question https stackoverflow com questions 1880275 good c registry w
  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • 岛屿和缺口问题

    背景故事 我有一个数据库 其中包含卡车司机的数据点 其中还包含 在卡车上时 驾驶员可以拥有 驾驶员身份 我想做的是按司机 卡车对这些状态进行分组 截至目前 我已尝试使用 LAG LEAD 来提供帮助 这样做的原因是我可以知道驱动程序状态何时
  • waitUntilObjectExists() Amazon S3 PHP SDK 方法,它到底是如何工作的?

    该函数是否会暂停 php 脚本 直到在 s3 服务器上找到该对象 我将它放在 foreach 循环中 一张一张地上传图像 找到对象后 我调用一个方法在本地删除图像 然后删除本地文件夹 如果为空 这是正确的处理方式吗 谢谢 foreach f
  • 从 json 创建下拉列表

    我有一个这种形式的 json COLUMNS ID Name DATA 1 Joe 2 Sam 3 Doug 我正在寻找一个如何在 javascript 中从该数据创建下拉列表的示例 但 json dropdown 列表的所有示例 json
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的