我编写了一个python GUI程序来处理一些科学计算。其中一个函数非常耗时,因此我希望将它放入一个单独的线程中,以便运行它不会阻塞整个程序。
问题是这个线程实际上没有启动(或者queue.get从未获得结果)。
但是,如果我将选项block = True传递给self.PLUQ = self.queue.get(block = False)语句,该函数将执行,但也将阻止整个程序。
Class PLUQ_GUI_Dialog():
#somefunctions to initiatialize the class
def guess_button_click_cb(self):
self.selected_peaks = self.session.selected_peaks()
if (not self.is_ready_to_guess()):
return
self.input_frequencies = self.get_input_frequencies(self.selected_peaks)
self.queue = Queue.Queue()
thread = threading.Thread(target = self.guess, args = (self.queue, self.input_frequencies))
thread.setDaemon(True)
thread.start()
self.top.after(100, self.process_queue)
def guess(self, queue, inputs):
PLUQ = pluq.PLUQ_interface()
#pluq is a separate python module
PLUQ.query(inputs)
#query does some calculations and put results in the PLUQ object
queue.put(PLUQ)
def process_queue(self):
try:
self.PLUQ = self.queue.get(block = False)
self.update_pluq_result() # This will display the result
except Queue.Empty:
self.top.after(100, self.process_queue)
#some helper function
答案 0 :(得分:0)
.setDaemon()
是Python 2.6及更早版API的一部分。您现在应该像这样设置守护程序线程:
self.queue = Queue.Queue()
thread = threading.Thread(target = self.guess, args = (self.queue, self.input_frequencies))
thread.daemon = True # like this
thread.start()
self.top.after(100, self.process_queue)
您可以详细了解here。
答案 1 :(得分:0)
问题可能与GIL有关。我通过使用multiprocessing.Process而不是threading.Thread来解决这个问题。