Python 3 中大规模、强力最大化的高效多重处理

2023-12-31

这是我最近的问题的延伸避免 Python 3 的多处理队列中的竞争条件 https://stackoverflow.com/questions/10607747/avoiding-race-conditions-in-python-3s-multiprocessing-queues。希望这个版本的问题更加具体。

TL;DR:在多处理模型中,工作进程从队列中使用multiprocessing.Queue,为什么我的工作进程如此空闲?每个进程都有自己的输入队列,因此它们不会相互争夺共享队列的锁,但队列实际上花费了大量时间为空。主进程正在运行一个 I/O 密集型线程——这是否会减慢 CPU 密集型输入队列的填充速度?

我试图在一定的约束下找到 N 个集合的笛卡尔积的最大元素,每个集合都有 M_i 个元素(对于 0 is_feasible回报True。在我的问题中,我试图找到其元素权重最大的组合:sum(element.weight for element in combination).

我的问题规模很大,但我公司的服务器也很大。我正在尝试将以下串行算法重写为并行算法。

from operator import itemgetter
from itertools import product # Cartesian product function from the std lib
def optimize(sets):
    """Return the largest (total-weight, combination) tuple from all
    possible combinations of the elements in the several sets, subject
    to the constraint that is_feasible(combo) returns True."""
    return max(
                map(
                    lambda combination: (
                        sum(element.weight for element in combination),
                        combination
                    ),
                    filter(
                        is_feasible, # Returns True if combo meets constraint
                        product(*sets)
                    )
                ),
                key=itemgetter(0) # Only maximize based on sum of weight
            )

我当前的多处理方法是创建工作进程并为它们提供输入队列的组合。当工人们收到一份毒丸 https://stackoverflow.com/questions/10607747/avoiding-race-conditions-in-python-3s-multiprocessing-queues他们将见过的最佳组合放入输出队列并退出。我从主进程的主线程填充输入队列。这种技术的一个优点是我可以从主进程生成一个辅助线程来运行监视工具(我可以使用一个 REPL 来查看到目前为止已处理的组合数量以及队列的满度)。

                    +-----------+
            in_q0   |   worker0 |----\
            /-------+-----------+     \
+-----------+   in_q1   +-----------+  \ out_q  +-----------+
|   main    |-----------|   worker1 |-----------|   main    |
+-----------+           +-----------+  /        +-----------+
            \-------+-----------+     /
            in_q2   |   worker2 |----/
                    +-----------+

我最初让所有工作人员从一个输入队列中读取数据,但发现它们都没有占用 CPU。考虑到他们把所有的时间都花在等待queue.get()解除阻塞上,我给了他们自己的队列。这增加了 CPU 的压力,因此我认为工作人员的活动频率更高。然而,队列大部分时间都是空的! (我从我提到的监控 REPL 中知道这一点)。这对我来说表明主循环填充队列的速度很慢。这是那个循环:

from itertools import cycle
main():
    # (Create workers, each with its own input queue)
    # Cycle through each worker's queue and add a combination to that queue
    for combo, worker in zip(product(*sets), cycle(workers)):
        worker.in_q.put(combo)
    # (Collect results and return)

我猜瓶颈是worker.in_q.put()。我怎样才能让它更快?我的第一反应是让工作线程变慢,但这没有意义……问题是监视器线程过于频繁地停止循环吗?我怎么能知道呢?

或者,是否有另一种方法来实现这一点,而不需要太多的等待锁?


你的元素是什么样的?可能是腌制它们以将它们放入队列的速度很慢,这显然会成为瓶颈。请注意,每个元素都被一遍又一遍地独立腌制。

如果是这种情况,这种方法可能会有所帮助:

  • 选择基数 >= 您的工作人员数量的集合。理想情况下,它会比工人数量多得多。将此集合称为 A,并将 A 的近似相等的子集分配给每个工人。将该子集传输给每个工作人员。
  • 将除 A 之外的所有集合的全部内容分发给每个工人(可能通过pickle.dumps一次,然后将相同的字符串传输给每个工作人员,或者可能通过共享内存或其他方式)。
  • 然后每个工作人员都拥有完成其子集所需的完整信息。它可以开始它的快乐之路product(my_A_subset, *other_sets)(可能顺序不同),在每个作业(或每三个作业或其他)之间轮询某种停止信号。这不需要通过队列,一位共享内存值就可以正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 中大规模、强力最大化的高效多重处理 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • ipython/ pylab/ matplotlib安装和初始化错误

    我在 OS X El Captain 上安装了 matplotlib anaconda ipython 然而 即使在尝试以所有可能的方式设置环境变量之后 我仍无法启动 ipython shell pylab 版本 这是错误 ImportEr
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • neo4j - python 驱动程序,服务不可用

    我对 neo4j 非常陌生 我正在尝试建立从 python3 6 到 neo4j 的连接 我已经安装了驱动程序 并且刚刚开始执行第一步 导入请求 导入操作系统 导入时间 导入urllib 从 neo4j v1 导入 GraphDatabas
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐