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



我有一个令人尴尬的并行问题,我打算使用多处理库来解决这个问题。我想通过GUI和取消按钮来添加功能。我在用游泳池。Map来生成我的进程,pool.terminate()来关闭我所有的工作进程。然而,我假设池。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,如果你按运行它运行,如果我按取消,我可以看到进程被杀死,但我假设我的线程正在等待池。映射到返回值。问题是,如果我运行,然后取消,我的主进程的内存只是不断增加,因为线程只是等待在那里卡住。

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

欢呼人

编辑:总结我的问题,每次我按下runButton一个线程是衍生的做一些预处理的东西,它保持所有这些东西在内存中,然后它产生池进程,我可以突然取消使用池。terminate(),但是当我做线程不关闭,所有的内存被保留。占用内存

使用pool.map_async: https://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

最新更新