我使用Mayavi2 mlab模块进行科学可视化。 有大约100k文件,我想要可视化并保存为图像,以便以后用gif动画组装它们。 为了加速这种可视化,我将使用多处理模块。 简单的例子如下。
from mayavi import mlab
def test_plot3d(dummy):
mlab.options.offscreen = True
l = mlab.plot3d([1,2], [1,2], [1,2])
mlab.savefig(str(dummy)+".png")
mlab.close()
from multiprocessing import Pool
NP = 2
pool = Pool(NP,maxtasksperchild=1)
res = pool.imap(test_plot3d,[x for x in xrange(0,4000)])
for r in res:
print "OK"
print "FINISH"
当NP为2时,一切正常。 当NP> 2时,出现下一个错误:
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
程序会生成一些图像,但它会挂在其他图像上,因此它永远不会完成。 谷歌告诉我,这是关于GTK和多线程的,但我指定maxtasksperchild for pool为1,这应该意味着每个进程一个任务,然后它将重新启动,并且每个进程只有一个mayavi实例(但是正如我所见,它不会发生。)
所以问题是如何正确启动并行mayavi可视化的进程池?