У меня был этот код, который должен запускать мои вычисления в отдельном потоке после «сигнала» из другого потока:
from threading import Thread, Condition
class MyClass(Thread):
def __init__(self):
Thread.__init__(self)
self.need_to_calculate = False
self.start()
def start_calculations(self):
self.need_to_calculate = True
def run(self):
while True:
if self.need_to_calculate:
self.perform_calculations()
a = MyClass()
a.start_calculations()
Я думал, что проверка условия - очень плохая идея, поэтому я решил использовать условные переменныедля рефакторинга этого кода:
class MyClass(Thread):
def __init__(self):
Thread.__init__(self)
self.my_condition_var = Condition()
self.start()
def start_calculations(self):
self.my_condition_var.acquire()
self.my_condition_var.notify_all()
def run(self):
with self.my_condition_var:
print('1')
while self.my_condition_var.wait():
print('2')
a = MyClass()
a.start_calculations()
Проблема заключается в том, что print ('2') не выполняется или, если я вызываю функцию receive из других функций, я получаю сообщение об ошибке:
raise RuntimeError("cannot notify on un-acquired lock")
RuntimeError: cannot notify on un-acquired lock