Matplotlib rpy2 和 Matplotlib 在 multiprocessing 模块下的冲突

Matplotlib rpy2 和 Matplotlib 在 multiprocessing 模块下的冲突

阅读更多:Matplotlib 教程

问题描述

在使用 Python 编写多线程程序的时候,可能会遇到 rpy2 和 Matplotlib 在 multiprocessing 模块下的冲突。具体体现在使用 rpy2 的时候,如果在多线程中同时使用 Matplotlib 进行绘图,程序可能会出现崩溃或者卡死的情况。

解决方法

要解决这个问题,我们可以通过两种方法来实现:

  1. 将 matplotlib.use(‘Agg’) 放在模块的最开始,或者函数的最开始。这样可以防止 matplotlib 和 rpy2 冲突。该方法可以在以下的代码中看到:
import rpy2.robjects as robjects
import multiprocessing as mp
import matplotlib
matplotlib.use('Agg')

def myfunc():
    robjects.r('pdf(file="output.pdf")')
    # do some rpy2 stuff
    # do some matplotlib stuff
    robjects.r('dev.off()')

if __name__ == "__main__":
    pool = mp.Pool(processes=2)
    pool.map(myfunc, ())
    pool.close()
    pool.join()
Python

在这个例子中,我们将 matplotlib.use(‘Agg’) 放在了函数的最开始,这样就可以在多线程中使用 rpy2 和 Matplotlib 进行绘图。

  1. 将 matplotlib.use(‘Agg’) 放在模块的最开始,或者函数的最开始,并将 Matplotlib 的绘图操作放在子进程中。该方法可以在以下的代码中看到:
import rpy2.robjects as robjects
import multiprocessing as mp
import matplotlib
matplotlib.use('Agg')

def myfunc():
    robjects.r('pdf(file="output.pdf")')
    # do some rpy2 stuff
    p = mp.Process(target=plot_image, args=("image.png",))
    p.start()
    p.join()
    robjects.r('dev.off()')

def plot_image(filename):
    # do some matplotlib stuff
    plt.savefig(filename)

if __name__ == "__main__":
    pool = mp.Pool(processes=2)
    pool.map(myfunc, ())
    pool.close()
    pool.join()
Python

在这个例子中,我们将 Matplotlib 的绘图操作放在了子进程中,这样就可以在多线程中使用 rpy2 和 Matplotlib 进行绘图。

总结

在使用 rpy2 和 Matplotlib 的时候,请注意在多线程中进行绘图时可能会出现冲突的情况。这时候可以通过将 matplotlib.use(‘Agg’) 放在模块的最开始,或者函数的最开始,并将 Matplotlib 的绘图操作放在子进程中来解决冲突问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册