如何多重处理将图保存到Python中的文件?

问题描述:

我试图保存许多matplotlib数字png磁盘文件,因为savefig()速度慢,我尝试通过使用多进程模块来提高速度。如何多重处理将图保存到Python中的文件?

这里是我的代码:(我的环境是Windows XP + python_2.6.1 + Matplotlib_1.2.0 + multiprocessing_0.70a1)

import multiprocessing 
from figure_creation_mudule import fig_list 

def savefig_worker(fig, img_type, folder_path): 
    file_name = fig.FM_figname 
    fig.savefig(folder_path+"\\"+file_name+"."+img_type, format=img_type) 
    return None 

if __name__ == '__main__': 
    pool = multiprocessing.Pool() 
    for fig in fig_list: 
     pool.apply_async(savefig_worker, [fig, 'png', 'D:\\img_folder']) 
    pool.close() 
    pool.join() 

而且fig_list是从其他模块导入的列表,包含matplotlib人物对象。

>>> fig_list 
[<matplotlib.figure.Figure object at 0x0AAA1670>, <matplotlib.figure.Figure object at 0x0AD2B210>, <matplotlib.figure.Figure object at 0x0B277FD0>] 

当我运行的代码,它满足的问题:

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "D:\Python\lib\threading.py", line 522, in __bootstrap_inner 
    self.run() 
    File "D:\Python\lib\threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "D:\Python\lib\multiprocessing\pool.py", line 225, in _handle_tasks 
    put(task) 
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

是什么意思?如何解决它?

+0

意图,我没有任何这方面的经验,但是从外观上来看,'pool.apply_async()'将在内部酸洗你要发送它的任务,以便一个单独的进程/线程可以取消它并使用它(在Python中'pickle'模块提供了一种序列化和反序列化任意对象的方法)。看起来像matplotlib数字不能被腌 – entropy 2013-03-05 13:26:18

我调查了一下,Pool.apply_async()确实会在幕后腌制对象。为了证实这一点,试试这个在REPL:

>>> from multiprocessing import Pool 
>>> def test(obj): 
... print obj 
... 
>>> class A(): 
... def __getstate__(self): 
...  print "pickling" 
...  return {} 
... 
>>> pool = Pool() 
>>> pool.apply_async(test, [A()]) 
<multiprocessing.pool.ApplyResult object at 0x10bbe82d0> 
pickling 

>>> <__main__.A instance at 0x10bbe83b0> 

为了避免这种情况,您需要使用其他的东西比multiprocessing.Pool做的工作。 multiprocessing.Process可以工作。但是,你应该注意不要产生太多的过程,否则你会放慢速度而不是加快速度。

编辑:如果你在使用multiprocessing.Poolthis question/answer应该帮助

+0

好的,会检查它。 – bigbug 2013-03-20 13:28:28