Python线程和多处理模块在Windows中具有意外结果

时间:2018-03-29 14:10:20

标签: python windows multithreading tkinter multiprocessing

我创建了一个应用程序,它在TKinter中实现了一个简单的GUI,按下一个按钮,它调用一个python脚本进行一些计算。所以,我有两个文件,一个GUI.py和一个Calculations.py。虽然整个应用程序在Ubuntu中运行良好,但我尝试在Windows中迁移它并获得了一些意想不到的结果。在GUI.py上,在我调用Calculations的时候,我还创建了一个带进度条的窗口,并通过队列检查算法的进度。我称之为计算的点的结构是这样的:

GUI.py

import Calculations as calc

class OptimizationGUI:
    def __init__(self, master):
        ...
        ...
    def start_calcs(self):
        self.queue = Queue()    #pass a queue object for returning the results
        self.calcs = threading.Thread(target=calc.main, args = (self.queue,...))
        self.calcs.daemon = True
        self.working_window = Toplevel()   
        self.pgb = ttk.Progressbar(self.working_window, orient=HORIZONTAL, length=200, mode='determinate')

        self.calcs.start()
        self.master.after(1000, self.check_queue)

     def check_queue(self):
        if self.optimization.is_alive():
           ... #do some calculations with the queue and show them in window
            self.master.after(1000, self.check_queue)
        else:
            self.working_window.destroy()
            self.show_final_result()
root = Tk()
my_gui = OptimizationGUI(root)
root.mainloop()

if __name__ == '__main__':
    freeze_support()
    import sys
    sys.exit(main(sys.argv))

Calculations.py结构是这样的:

def main(queue,...)
    ...
#more functions and calculations that include spawning proccesses like this:
def heavy_calcs_proccesses():
    for i in range(core_number):
        recv_end, send_end = Pipe(False)
        p = Process(target=estimate_fitness_function, args=(...))
        jobs.append(p)
        pipe_list.append(recv_end)
        p.start()

    for proc in jobs:
        proc.join()
    result_list = [x.recv() for x in pipe_list]
    return result_list

if __name__ == '__main__':
    freeze_support()
    import sys
    sys.exit(main(sys.argv))

好吧,正如我之前所说,该程序在Ubuntu中运行良好。现在在Windows中会出现这样的情况:当我按下"运行"按钮(进入start_calcs函数并启动线程的那个),以及进度条窗口,另一个主窗口(我的应用程序的主要部分)显示!进度条完全没有进展。此外,没有进行任何计算(我可以说,因为任务管理器中没有其他核心显示)。我的Calculations.py脚本有一些初始计算,但我认为当它到达产生更多进程的点时,由于某种原因它会停止。因此在Windows中它有两个问题:一个是GUI.py中的线程模块,另一个是Calculations.py中的进程。我只能猜测它是一个多处理多线程问题,但无法弄清楚是什么。

0 个答案:

没有答案