我创建了一个应用程序,它在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中的进程。我只能猜测它是一个多处理多线程问题,但无法弄清楚是什么。