我有一个令人尴尬的并行问题,我的目标是使用多处理库来解决。我想通过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
答案 0 :(得分:1)
使用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