Здравствуйте, netch80, Вы писали:
N>Периодически возникает при многонитевом построении примерно следующий "паттерн": есть элемент состояния/управления (как очередь заданий), который требует контролируемого взаимодействия с помощью лока и "условной переменной". Но чтобы на время выполнения задания не блокировать тех, кто хочет установить следующее задание, лок снимается на это время. Получается следующая схема:
Перечитал код внимательнее. У тебя же тут шиворот-навыворот. Ты не должен держать лок когда не надо. А должен захватывать когда надо:
while True:
## лочим
with self.lock:
while not self.task: ## не надо "if" тут, google: Spurious wakeup
self.cv.sleep() ## а вот это я что-то не понял. Зачем sleep??! или это await имеется в виду?
task = self.task
self.task = None
## всё, больше локи не нужны
try:
self.execute(task)
except Exception:
... пожаловались ...