关于这个主题有很多问题,但显然没有一个与我的确切用例相符合。你知道吗
我在运行一个长循环,每次迭代都要花费很多时间。我想在每个循环的末尾绘制(使用matplotlib
)当前的进度。基本设置是
import matplotlib.pyplot as plt
def plotStuff(data)
plt.figure()
plt.plot(data)
plt.savefig('test.pdf')
def main():
for iteration in range(1000):
data = doStuff(oldData)
if convergence(data, oldData):
break
plotStuff(data)
oldData = data
if __name__ == '__main__':
main()
但是,绘图例程需要很多时间。我最初的解决办法是
import threading
并将绘图部分改为
plottingThread = threading.Thread(target=plotStuff, args=data)
plottingThread.start()
但是,matplotlib
似乎不是线程保存。我最新的想法是
import multiprocessing
以及
def main():
pool = multiprocessing.Pool(processes=1)
for iteration in range(1000):
data = doStuff(oldData)
if convergence(data, oldData):
break
res = pool.apply_async(plotStuff, args=(data,))
oldData = data
但是,这似乎只会安排函数调用,而不会实际执行它。执行通过pool.close(); pool.join()
或res.get()
进行。但是,pool.join()
和res.get()
确实会阻止主进程,直到池完成。你知道吗
我想我的问题是:我怎样才能异步调用plotStuff(data)
,而不必等待结果?你知道吗
另外,如果有办法控制泳池里的工作,我会很高兴的。比方说,我只希望池中有max10
个作业,而且绘图太慢--有没有办法删除最旧的作业,这样我们就有机会赶上“外部进程”?你知道吗
关于第一个问题,你的假设是错误的。实际的计算在调用} 对象可用于检索计算结果。它将阻止,直到他们准备好,但你可以忽略它,如果你想。你知道吗
apply_async
之后立即进行。方法返回的^{请记住,如果不收集} 时设置回调函数,并在那里打印错误消息。你知道吗
AsyncResult
,则plotStuff
中触发的错误将不会被注意到。如果仍然要报告错误,可以在调用^{对于问题的第二部分,我想请你更详细地阐述一下,因为还不清楚你想要达到什么目的。你知道吗
相关问题 更多 >
编程相关推荐