Если ваш основной поток продвинулся настолько далеко, насколько это возможно без результата рабочего потока, и вы хотите заблокировать его, вы можете использовать threading.Event
для ожидания определенного момента в выполнении рабочего потока или thread.join
(где thread
- экземпляр threading.Thread
), чтобы дождаться завершения рабочего потока:
class Example(object):
def my_calc(self, x, y):
time.sleep(2)
self._z = x + y # or push the result to a queue
def example(self):
thread = threading.Thread(target=self.my_calc, args=(2, 20))
thread.start()
# any other useful work could go here while the worker runs
thread.join()
return self._z + 10 # or grab the result from a queue
def runner():
print "start"
z = Example().example()
print "result is {0}".format(z)
Однако в контексте графического интерфейса маловероятно, что ваш основной поток продвинулся настолько далеко, насколько это возможно - он, вероятно, постоянно занят, поддерживая отзывчивость графического интерфейса. В этом случае, как уже упоминалось в комментариях к этому вопросу, лучше просто упаковать все, что вы хотите сделать после того, как вычисления рабочего закончатся, в обратный вызов для рабочего потока, чтобы вызвать:
def my_calc(x, y):
time.sleep(2)
return x + y
def my_calc_thread(x, y, callback):
z = my_calc(x, y)
# depending on your GUI framework, you may need to do something
# like call_in_main_thread(callback, z) if callback touches GUI
# elements
callback(z)
def example():
def finish(z):
print "result is {0}".format(z)
t = threading.Thread(target=my_calc_thread, args=(2, 20, finish))
t.start()
def runner():
print "start"
example()