Nai*_*ent 5 python matplotlib python-multiprocessing
我可以在同一张图中绘制单独的处理吗?例如下面的代码只能保存图中的最后一个图。
import matplotlib
matplotlib.use('agg')
from multiprocessing import Pool
import matplotlib.pyplot as plt
def f111(a,b,fig):
plt.plot(a,b,'ro')
plt.savefig('test.jpg')
if __name__=='__main__':
fig=plt.figure(figsize=(20,10))
p=Pool(8)
for i in range(8):
p.apply_async(f111,args=(1+i*6,6+i*6,fig))
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)
我相信在这种情况下传递给 apply_async 的“fig”会成为一个副本,而不是指向最初创建的“fig”对象的指针,这里发生的情况是每个进程(从它自己的 Fig 副本)仅保存到 test.jpg它自己绘制的数据来自
plt.plot(a, b, 'ro')
Run Code Online (Sandbox Code Playgroud)
您看到的是最后完成的进程。
您是否必须在单独的流程中执行此操作?像这样简单的事情最好用一个简单的循环来绘制。
但是,如果您需要在池中进行大量计算,您可能希望将结果存储在 multiprocessing.Array 中,该数组允许您从所有子进程写入数据,并可以稍后在父进程中使用。通过这种方式,您可以在父进程中绘制单个图形,这很容易,但仍然具有快速并行计算的好处
import matplotlib
matplotlib.use('agg')
from multiprocessing import Pool, Array
import matplotlib.pyplot as plt
def f111(i, a, b, arr_a, arr_b):
calc_value_a = a * 2
calc_value_b = b * 2
arr_a[i] = calc_value_a
arr_b[i] = calc_value_b
if __name__=='__main__':
fig=plt.figure(figsize=(20,10))
arr_a = Array('i', range(8))
arr_b = Array('i', range(8))
p=Pool(8)
for i in range(8):
p.apply_async(f111, args=(i, 1+i*6, 6+i*6, arr_a, arr_b))
p.close()
p.join()
plt.plot(arr_a, arr_b, 'ro')
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2454 次 |
| 最近记录: |