关闭正在等待mp.pool.map返回值的线程(并清理内存)

时间:2014-06-17 05:56:17

标签: python multithreading user-interface tkinter multiprocessing

我有一个令人尴尬的并行问题,我的目标是使用多处理库来解决。我想通过GUI和取消按钮添加功能。我正在使用pool.map生成我的进程,并使用pool.terminate()来关闭所有工作进程。但是,我假设pool.map正在阻塞并等待返回结果。我也在使用线程来确保GUI(Tkinter)不会冻结。

一些代码让你知道我的意思。

import multiprocessing
import threading
import Tkinter

def expensiveFunction()
    #do some stuff


if __name__=='main':
    master=Tkinter.Tk()
    master.title("My Title")
    master.geometry("some dimension")
    master.resizable(0,0)

    def analysisFunction():
        global pool
        #do some preprocessing stuff
        Input=[,,,] #some iterable here
        pool=multiprocessing.Pool()
        Results=pool.map(expensiveFunction,Input)

    def threadedFunction():
        myThread=threading.Thread(None,analysisFunction,None)

    def cancel():
        global pool
        pool.terminate()

    runButton=Tkinter.Button(master,text = "Run Analysis",command = threadedFunction)
    runButton.pack(fill = x)
    cancelButton=Tkinter.Button(master,text = "Cancel Analysis", command = cancel)
    cancelButton.pack(fill = x)

基本上当你启动脚本时,它会打开一个GUI,如果你按下运行它运行,如果我按下取消我可以看到进程被杀死但我假设myThread正在等待pool.map返回值。问题是,如果我运行,然后取消,我的主进程的内存会不断增加,因为线程只是等待那里卡住了。

有没有办法以某种方式杀死线程/删除内存。我需要那里的线程,以便我可以在执行分析时访问我的GUI以取消它。

干杯球员

编辑:总结一下我的问题,每次按下runButton都会生成一个线程,它会执行一些预处理工作,它会将所有这些内容保存在内存中,然后它会生成池进程,我可以使用pool.terminate()突然取消但是,当我这样做时,线程没有关闭,所有内存都被保留。杀了我的RAM

1 个答案:

答案 0 :(得分:1)

使用pool.map_asynchttps://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map_async

您可以提供回调,以便在完成后可以在Tk GUI中执行某些操作。

这就是它大致的样子:

def analysisFunction():
    global pool
    #do some preprocessing stuff
    Input=[,,,] #some iterable here
    pool=multiprocessing.Pool()
    pool.map_async(expensiveFunction,Input, callback=success)

def threadedFunction(success_callback):
    myThread=threading.Thread(target=analysisFunction)

def success(results):
    # Do stuff with the results
    pass