Как правильно использовать условную переменную в Python, когда мне нужно запустить бесконечный цикл в отдельном потоке? - PullRequest
0 голосов
/ 15 января 2019

У меня был этот код, который должен запускать мои вычисления в отдельном потоке после «сигнала» из другого потока:

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
...