将Python的多处理模块与cvxopt包一起使用

时间:2013-06-17 08:31:19

标签: python python-3.x multiprocessing cvxopt

我刚刚遇到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语句时,每个进程最终只占用CPU的25%,就像它与其他进程同步一样。

我对解释和解决方法感兴趣。如果文档中有一个我忽略的明显解释,我很抱歉。


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

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

的方法
  1. 安装matplotlib 1.2.1(我这样做是因为它包含了pylab,它在许多cvxopt示例脚本中使用。我不确定这是否是实际要求)。我使用this tar.gz packagesudo 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

1 个答案:

答案 0 :(得分:1)

可能与Python GIL没有发布有什么关系?

请参阅:http://comments.gmane.org/gmane.comp.python.scientific.user/15678