matplotlib和python多线程/多处理文件处理

matplotlib和python多线程/多处理文件处理,python,multithreading,matplotlib,multiprocessing,python-multithreading,Python,Multithreading,Matplotlib,Multiprocessing,Python Multithreading,我有大量文件要处理。我已经写了一个脚本来获取、排序和绘制我想要的数据。到目前为止,一切顺利。我已经测试了它,它给出了期望的结果 然后我想使用多线程来实现这一点。我已经查阅了互联网上的文档和示例,在我的程序中使用一个线程就可以了。但是当我使用更多的时候,在某个点上我得到了随机的matplotlib错误,我怀疑其中存在一些冲突,即使我使用了一个带有绘图名称的函数,我看不出问题出在哪里 这里是整个脚本如果你需要更多的评论,我会添加它们。多谢各位 #/usr/bin/python 导入matplotli

我有大量文件要处理。我已经写了一个脚本来获取、排序和绘制我想要的数据。到目前为止,一切顺利。我已经测试了它,它给出了期望的结果

然后我想使用多线程来实现这一点。我已经查阅了互联网上的文档和示例,在我的程序中使用一个线程就可以了。但是当我使用更多的时候,在某个点上我得到了随机的matplotlib错误,我怀疑其中存在一些冲突,即使我使用了一个带有绘图名称的函数,我看不出问题出在哪里

这里是整个脚本如果你需要更多的评论,我会添加它们。多谢各位

#/usr/bin/python
导入matplotlib
matplotlib.use('GTKAgg')
将numpy作为np导入
从scipy.interpolate导入网格数据
将matplotlib.pyplot作为plt导入
将matplotlib.colors作为mcl导入
从matplotlib导入用于乳胶的rc#
将时间导入为tm
导入系统
导入线程
导入队列#3.2中的队列和2.7中的队列!
导入pdb#调试器
rc('text',usetex=True)#用于乳胶
map=0#初始化map索引。它将用于对数组进行如下索引:array[map[x,y]]
time=np.zeros(1)#存储时间的数组
中间h=np.0((0,3))#xφc
#在箱子中间
当前文件=打开(“单个无效循环周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性
对于当前_文件中的行:
如果line.startswith('#===时间'):
map+=1
np.append(time,[float(line.strip('#===time'))]
elif line.startswith(“#”):
通过
其他:
v=np.fromstring(line,dtype=float,sep='')
middle_h=np.vstack((middle_h,v[[1,3,4]]))
当前_文件。关闭()
middle_h=middle_h.重塑((map,-1,3))#三维数组:map,x,phi,c
#####
def load_和_plot():#将加载一个映射文件,并将其与之前加载的相应配置文件一起打印
当不退出_标志时:
打印(“垃圾工作…”)
#尝试:
如果不是任务_queue.empty():
map\u index=tasks\u queue.get()
打印(“--->处理映射:%s”%map\u索引)
x、 y,zp=np.loadtxt(“单一无效周期增长周期后映射”+str(映射索引),unpack=True,usecols=[1,2,3])
对于枚举中的i,el(zp):

如果el遵循David的建议,那么我是在多处理中完成的。使用8个处理器,我的速度提高了5倍。我相信剩下的工作就是在我的脚本开始时完成单个流程的工作。 编辑:但是,有时脚本在最后一个贴图处“挂起”,即使它生成了正确的贴图,但会出现以下错误:

文件“single\u void\u cyl\u plot\u mprocess.py”,第90行,在tasks\u queue.join()中

文件“/usr/local/epd-7.0-2-rh5-x86_64/lib/python2.7/multiprocessing/queues.py”,第316行,在join self.\u cond.wait()中

文件“/usr/local/epd-7.0-2-rh5-x86_64/lib/python2.7/multiprocessing/synchronize.py”,第220行,在wait self.\u wait_信号量.acquire中(True,超时)

将numpy导入为np
从scipy.interpolate导入网格数据
将matplotlib.pyplot作为plt导入
从matplotlib导入用于乳胶的rc#
从多处理导入进程,JoinableQueue
导入pdb#调试器
rc('text',usetex=True)#用于乳胶
map=0#初始化map索引。它将用于像这样索引数组:array[map,x,y,…]
time=np.zeros(1)#存储时间的数组
中间h=np.0((0,3))#xφc
#在箱子中间
当前文件=打开(“单个无效循环周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性周期性
对于当前_文件中的行。readlines():
如果line.startswith('#===时间'):
map+=1
np.append(time,[float(line.strip('#===time'))]
elif line.startswith(“#”):
通过
其他:
v=np.fromstring(line,dtype=float,sep='')
middle_h=np.vstack((middle_h,v[[1,3,4]]))
当前_文件。关闭()
middle_h=middle_h.重塑((map,-1,3))#三维数组:map,x,phi,c
#######
def load_和_plot():#将加载一个映射文件,并将其与之前加载的相应配置文件一起打印
而任务\u queue.empty()==False:
打印(“垃圾工作…”)
尝试:
map_index=tasks_queue.get()#从队列中获取一些要做的工作
打印(“--->处理映射:%s”%map\u索引)
x、 y,zp=np.loadtxt(“单一无效周期增长周期后映射”+str(映射索引)\
unpack=True,usecols=[1,2,3])
对于枚举中的i,el(zp):

如果elI建议使用
多处理
而不是线程。我使用它成功地实现了并行图形绘制。谢谢,它看起来更复杂,但我会尝试一下。您只启动最后一个线程;在循环中移动
working\u bee.start()
要创建多处理版本,请将全局级别的代码移动到main()函数中,在
中调用它,如果uuu name\uuuu==“uuuu main\uuuuu”:
阻塞,将线程.threading替换为多处理.processing和队列.Queue替换为多处理.Queue。顺便说一句,
queue.empty()
可能不可靠,您可以使用sentinel值代替,例如,在主线程末尾:
用于范围内的i(len(线程列表)):queue.put(None)
,在每个线程中:
用于iter中的map_索引(queue.get,None):…
您还可以尝试
pool=multiprocessing.pool()
对于pool.imap\u unordered(process\u job,jobs):pass
我可能会尝试一下,在加入的某个地方似乎有一个bug…它不是每次都发生,但它让我困惑。