此代码运行正常,因为产生了所需的输出,但显示了一条奇怪的错误消息:
QObject :: ~QObject:无法从另一个线程停止定时器。
from multiprocessing import Pool,Manager
import matplotlib.pyplot as plt
import numpy as np
import time
def scatter_join(args):
num = args[2]
print(num)
plt.scatter(args[0],args[1],s=1)
plt.savefig('test_p'+str(num)+'.png')
if args[3].empty() is False:
args[4].acquire()
(ax,fig) = args[3].get()
ax.scatter(args[0],args[1],s=1)
args[3].put((ax,fig))
args[4].release()
else:
args[4].acquire()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(args[0],args[1],s=1)
args[3].put((ax,fig))
args[4].release()
return None
if __name__ == '__main__':
p = Pool()
m = Manager()
q = m.Queue()
l = m.Lock()
snap = []
for looper in range(0,50):
np.random.seed(int(time.time()))
snap.append( np.random.normal(0+np.random.randint(-5,5),20+np.random.randint(-5,5),(10000,2)) )
task = [(snap[x][:,0],snap[x][:,1],x,q,l) for x in range(0,50)]
t = time.time()
results = p.map(scatter_join,task,chunksize=18)
p.close()
p.join()
print('Time Elapsed(Parallel): ', abs((time.time()-t)))
(ax,fig) = q.get()
fig.savefig('superimposedimg.png')
t = time.time()
for looper in range(0,50):
print(looper)
np.random.seed(int(time.time()))
plt.scatter(snap[looper][:,0],snap[looper][:,1],s=1)
plt.savefig('test_s'+str(looper)+'.png')
plt.clf()
print('Time Elapsed(Linear): ',abs(time.time()-t))
我基本上想要使用多处理在simgle matplotlib对象中绘制绘图图形。
答案 0 :(得分:0)
当这样绘图时,你需要确保后端 设置为agg后端。您可以在matplotlibrc文件中执行此操作 直接在绘图脚本中,导入matplotlib后立即执行 在导入pyplot之前(如果你完全使用pyplot)。
# do this before importing pylab or pyplot
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
http://matplotlib.org/faq/howto_faq.html#howto-webapp
你也可以单独策划。例如:
fig = plt.figure()
fig, ax = plt.subplots()
> plot stuff, scatterplot, etc..., set title, lables, etc...
fig.savefig(filename, format='png', dpi=100, facecolor='w',
edgecolor='k')
plt.close(fig)
注意:因为我们在你不必使用fig.clf()来清除之后关闭了情节。