如何在Python中多进程保存图像到文件?
我正在尝试将很多matplotlib图形保存为png格式的文件,因为使用savefig()这个方法比较慢,所以我想通过使用multiprocess模块来提高速度。
这是我的代码:(我的环境是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
这是什么意思呢?我该怎么解决?
1 个回答
1
我查了一下,确实,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.Pool
,可以参考 这个问题/答案,可能会对你有帮助。