-->

Python的rpy2和matplotlib冲突的利用多重时(Python rpy2 and mat

2019-09-01 06:15发布

我试图计算和使用多产生地块。 在Linux下面的代码运行正常,但在Mac(ML)不是,给下面的错误:

import multiprocessing
import matplotlib.pyplot as plt
import numpy as np
import rpy2.robjects as robjects

def main():
    pool = multiprocessing.Pool()
    num_figs = 2
    # generate some random numbers
    input = zip(np.random.randint(10,1000,num_figs), 
                range(num_figs))

    pool.map(plot, input)

def plot(args):
    num, i = args
    fig = plt.figure()
    data = np.random.randn(num).cumsum()
    plt.plot(data)

main()

该Rpy2是rpy2 == 2.3.1和R为2.13.2(我不能安装R 3.0和任何MAC rpy2最新版本没有得到段错误)。

错误是:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().

我想尽一切办法了解的问题是,没有运气的东西。 我的配置是:

Danials-MacBook-Pro:~ danialt$ brew --config
HOMEBREW_VERSION: 0.9.4
ORIGIN: https://github.com/mxcl/homebrew
HEAD: 705b5e133d8334cae66710fac1c14ed8f8713d6b
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CELLAR: /usr/local/Cellar
CPU: dual-core 64-bit penryn
OS X: 10.8.3-x86_64
Xcode: 4.6.2
CLT: 4.6.0.0.1.1365549073
GCC-4.2: build 5666
LLVM-GCC: build 2336
Clang: 4.2 build 425
X11: 2.7.4 => /opt/X11
System Ruby: 1.8.7-358
Perl: /usr/bin/perl
Python: /usr/local/bin/python => /usr/local/Cellar/python/2.7.4/Frameworks/Python.framework/Versions/2.7/bin/python2.7
Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

有任何想法吗?

Answer 1:

当你的主线程之外执行GUI操作Mac OS X上会出现此错误,这是你被你的绘图功能转移到multiprocessing.Pool(我想它不会在Windows无论出于同样的原因工作做什么 - 因为Windows有同样的要求)。 我可以想像它使用的是池生成数据的工作,然后有在所返回的数据环路主线程等待(队列是我通常处理它...的方式)的唯一途径。

下面是一个例子(要认识到你想要的东西,这可能不会做 - 剧情所有的数字“同时” - plt.show()块,这样只能有一个时间绘制和我注意到你没有它你的样品中代码 - 但没有我没有看到我的任何屏幕上 - 但是,如果我把它拿出来 - 没有阻挡,没有错误,因为所有的GUI功能都在主线程中发生的事情):

import multiprocessing
import matplotlib.pyplot as plt
import numpy as np
import rpy2.robjects as robjects

data_queue = multiprocessing.Queue()


def main():
    pool = multiprocessing.Pool()
    num_figs = 10

    # generate some random numbers
    input = zip(np.random.randint(10,10000,num_figs), range(num_figs))  
    pool.map(worker, input)

    figs_complete = 0
    while figs_complete < num_figs:
        data = data_queue.get()
        plt.figure()
        plt.plot(data)
        plt.show()
        figs_complete += 1

def worker(args):
    num, i = args
    data = np.random.randn(num).cumsum()
    data_queue.put(data)
    print('done ',i)

main()

希望这可以帮助。



Answer 2:

我与我的工作人员,这是加载一些数据,生成一个情节,并将其保存到一个文件类似的问题。 请注意,这是比什么OP的情况下,这似乎周围的交互式绘图取向略有不同。 不过,我认为这是相关的。

我的代码的简化版本:

def worker(id):
    data = load_data(id)
    plot_data_to_file(data) # Generates a plot and saves it to a file.

def plot_something_parallel(ids):
    pool = multiprocessing.Pool()
    pool.map(worker, ids)

plot_something_parallel(ids=[1,2,3])

这引起了同样的错误,其他人提及:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.

继@思想bbbruce的火车上,我从切换matplotlib后端解决我的问题TKAgg为默认值。 具体来说,我注释掉在我的下面一行matplotlibrc文件:

#backend : TkAgg


Answer 3:

这可能是rpy2特定的。 有与OS X和多处理类似的问题的报告在这里和那里 。

我认为,使用进口来运行的情节可以解决这个问题(代码中所需的软件包的初始化多-DOC )。



Answer 4:

尝试matplotlib升级到3.0.3:

pip3 install matplotlib --upgrade

然后,一切顺利。

================================================== =====================

无需阅读下文了。

昨天,我的多进程情节的作品在我的MacBook Air。 但不工作我的MacBook Pro明天早上有相同的代码,显示多种:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().

他们都采用第4代英特尔我CPU(与空气i5-4xxx与亲i7-4xxx)。 因此,如果有在硬件上没有什么区别,它必须是软件。

所以,我只是想更新matplot到3.0.3上的MacBook Pro(是3.0.1),每一件事情去罚款。

此外,没有必要做pool.apply_async了。



文章来源: Python rpy2 and matplotlib conflict when using multiprocessing