我有一个代码,它从多个名为001.txt,002.txt,...,411.txt的文件中读取数据。我想从每个文件中读取数据,绘制它们,并保存为001.jpg,002.jpg,...,411.jpg。
我可以通过循环浏览文件来完成此操作,但我想使用多进程模块来加快速度。
但是,当我使用下面的代码时,计算机挂起 - 我无法点击任何东西,但鼠标移动,声音继续。然后我必须打开电脑的电源。
我显然在使用matplotlib来滥用多进程模块。我使用了与下面的代码非常相似的东西来实际生成数据,并保存到文本文件没有任何问题。我错过了什么?
import multiprocessing
def do_plot(number):
fig = figure(number)
a, b = random.sample(range(1,9999),1000), random.sample(range(1,9999),1000)
# generate random data
scatter(a, b)
savefig("%03d" % (number,) + ".jpg")
print "Done ", number
close()
for i in (0, 1, 2, 3):
jobs = []
# for j in chunk:
p = multiprocessing.Process(target = do_plot, args = (i,))
jobs.append(p)
p.start()
p.join()
答案 0 :(得分:3)
使用multiprocessing
最重要的是仅为主进程运行模块的主代码。这可以通过测试if __name__ == '__main__'
来实现,如下所示:
import matplotlib.pyplot as plt
import numpy.random as random
from multiprocessing import Pool
def do_plot(number):
fig = plt.figure(number)
a = random.sample(1000)
b = random.sample(1000)
# generate random data
plt.scatter(a, b)
plt.savefig("%03d.jpg" % (number,))
plt.close()
print("Done ", number)
if __name__ == '__main__':
pool = Pool()
pool.map(do_plot, range(4))
另请注意,我用流程池替换了单独流程的创建(它可以更好地扩展到许多图片,因为它只使用与可用内核一样多的流程)。