Многопоточность Python: нужен совет для синхронизации 2 потоков с помощью условной переменной

Я знаю только основные понятия о многопоточности, и в настоящее время я сталкиваюсь с ситуацией, которая нуждается в некоторой помощи.

У меня есть две задачи для завершения, и обе должны выполняться непрерывно. Дело в том, что вторая задача должна запускаться только после того, как первый поток сначала выполнил несколько заданий. Прямо сейчас два класса потока выглядят примерно так:

finished = False # shared flag 

class first(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        do_something()
        self.finished = True #change the flag
        self.cond.notify()
        self.cond.release()
        do_something_else()


class second(threading.Thread):
    def __init__(self, cond, finished):
        threading.Thread.__init__(self)
        self.cond = cond
        self.finished = finished

    def run(self):
        self.cond.aquire()
        while self.finished == False:
            self.cond.wait()
        self.cond.release()
        do_something()

Однако дело в том, что программа по-прежнему выполняется случайным образом независимо от wait() и notify(). Кто-нибудь может мне помочь с этим вопросом? Благодарю.

2 ответа

Решение

self.finished в class first является копией значения глобального finished, а не ссылка на него, поэтому он не имеет прямого отношения к self.finished из class second,

Вы, вероятно, должны создать глобальный Queue объект (который предназначен для использования с threading модуль). Пусть оба класса ссылаются на очередь, и пусть первый поток записывает сигнал о прохождении в очередь, а второй блок - до тех пор, пока не будет считано разрешение.

Вы можете избежать синхронизации в целом. Используйте 3 темы вместо 2.

Поток 1a "выполняет какую-то работу" и завершается. Поток 1b начинается там, где закончился 1a, а поток 2 начинается независимо.

(Также я предполагаю, что вы знаете, что вы не можете эффективно разделять ЦП с потоками Python; они хороши только для параллельного ожидания ввода-вывода. Когда вам требуется параллелизация с ЦП, вы используете многопроцессорность.)

Другие вопросы по тегам