【问题标题】:Using Python's multiprocessing module together with the cvxopt package将 Python 的多处理模块与 cvxopt 包一起使用
【发布时间】:2013-06-17 08:31:18
【问题描述】:

我刚刚遇到了cvxopt package 用于凸优化的问题,我在documentation 中没有发现这个问题。我想知道是否有人知道导致它的原因以及如何最好地解决它。

问题在于,当您在使用 multiprocessing.Process 实例的 Python 程序中 import cvxopt 时,进程无法再并行运行。它们似乎自动同步。请注意,无论程序是否实际使用了任何cvxopt 函数,都会发生这种情况。只需导入包就会产生这种效果。

示例:

# import cvxopt
from multiprocessing import Queue, Process

def compute(queue):
    """
    Pick integers from a queue and perform some useless
    calculations on them just to keep the CPU busy.
    """
    total = 0
    while True:
        item = queue.get()
        if item is None:
            break
        for i in range(item):
            total += i

if __name__ == '__main__':
    queue = Queue()
    procs = []
    for i in range(4):
        proc = Process(target = compute,
                       args   = (queue,))
        proc.start()
        procs.append(proc)

    for i in range(100000):
        queue.put(i)
    for proc in procs:
        queue.put(None)
    for proc in procs:
        proc.join()

上面的脚本启动了四个与主程序并行运行的进程。在具有四个内核的机器上,我有四个进程,每个进程占用 100% 的 CPU。

但是,如果在开始时取消注释 import cvxopt 语句,每个进程最终只占用 25% 的 CPU,就好像它与其他进程同步一样。

我对解释和解决方法都感兴趣。如果我忽略的文档中有明显的解释,我深表歉意。


有关如何重现问题的详细信息

我运行它的环境是 Linux 3.5.0(Ubuntu 12.10 发行版)和 Python 3.2.3。这就是我安装 cvxopt 的方式:

  1. 安装 matplotlib 1.2.1(我这样做是因为它包含 pylab,它用于许多 cvxopt 示例脚本中。我不确定这是否是实际要求)。我使用this tar.gz package 并使用sudo python3 setup.py install 安装它。

  2. 已安装 BLAS 和 ATLAS

    sudo apt-get install libblas-dev libblas3 libatlas-base-dev libatlas3-base libblas-test libopenblas-base libopenblas-dev
    

    以上可能是多余的,但如果这引起任何问题,我会感到惊讶。

  3. 已安装 cvxopt 1.1.6,使用 tar.gz 包 from heresudo python3 ./setup.py install

【问题讨论】:

  • 提及您的操作系统以及您是否使用github.com/cvxopt/cvxopt/blob/master/INSTALL中列出的任何可选依赖项可能会有所帮助
  • @JanneKarila 再次感谢您的来信。我现在已经为这个问题添加了更多细节。

标签: python python-3.x multiprocessing cvxopt


【解决方案1】:

也许与 Python GIL 未发布有关?

见:http://comments.gmane.org/gmane.comp.python.scientific.user/15678

【讨论】:

  • 这可能与此有关,但我想更好地理解这一点。据我所知,multiprocessing 模块(相对于threading 模块)不应直接受到 GIL 的影响。
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2012-03-04
相关资源
最近更新 更多