Информация об изменениях

Сообщение Re: Multithreading: как очередь, но вручную и красиво? от 26.01.2026 14:14

Изменено 26.01.2026 14:33 ·

Re: Multithreading: как очередь, но вручную и красиво?
Здравствуйте, netch80, Вы писали:

N>Периодически возникает при многонитевом построении примерно следующий "паттерн": есть элемент состояния/управления (как очередь заданий), который требует контролируемого взаимодействия с помощью лока и "условной переменной". Но чтобы на время выполнения задания не блокировать тех, кто хочет установить следующее задание, лок снимается на это время. Получается следующая схема:

Перечитал код внимательнее. У тебя же тут шиворот-навыворот. Ты не должен держать лок когда не надо. А должен захватывать когда надо:

while True:
    ## лочим
    with self.lock:
        while not self.task: ## не надо "if" тут, google: Spurious wakeup
            self.cv.sleep()  ## а вот это я что-то не понял. Зачем sleep??! или это await имеется в виду?
            continue
        task = self.task
        self.task = None
    ## всё, больше локи не нужны
    try:
        self.execute(task)
    except Exception:
        ... пожаловались ...
Re: Multithreading: как очередь, но вручную и красиво?
Здравствуйте, 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:
        ... пожаловались ...