我不知道的异步进程

2024-09-30 06:16:10 发布

您现在位置:Python中文网/ 问答频道 /正文

关于这个主题有很多问题,但显然没有一个与我的确切用例相符合。你知道吗

我在运行一个长循环,每次迭代都要花费很多时间。我想在每个循环的末尾绘制(使用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个作业,而且绘图太慢--有没有办法删除最旧的作业,这样我们就有机会赶上“外部进程”?你知道吗


Tags: import绘图fordataifmatplotlibmaindef
1条回答
网友
1楼 · 发布于 2024-09-30 06:16:10

关于第一个问题,你的假设是错误的。实际的计算在调用apply_async之后立即进行。方法返回的^{}对象可用于检索计算结果。它将阻止,直到他们准备好,但你可以忽略它,如果你想。你知道吗

请记住,如果不收集AsyncResult,则plotStuff中触发的错误将不会被注意到。如果仍然要报告错误,可以在调用^{}时设置回调函数,并在那里打印错误消息。你知道吗

对于问题的第二部分,我想请你更详细地阐述一下,因为还不清楚你想要达到什么目的。你知道吗

相关问题 更多 >

    热门问题