Ответ 1
Конечно!
>>> from threading import Lock
>>> x = Lock()
>>> x.locked()
False
>>> x.acquire()
True
>>> x.locked()
True
Вы также можете сделать неблокирующее приобретение:
x.acquire(False)
x.release()
В этом случае, если x
был разблокирован, код получает его и освобождает. Но если x уже был заблокирован, неблокирующее получение возвращает сразу (и возвращает False
), и мы снова отпускаем его. Но это подвержено гонкам! Нет ничего, что могло бы помешать другому потоку снять блокировку между этими двумя строками.
То же .locked()
для проверки .locked()
. Это говорит только о состоянии блокировки во время выполнения .locked()
. Это может больше не быть правдой ко времени выполнения следующего оператора.
Кстати, тело run()
лучше написать с использованием блокировки в качестве "диспетчера контекста", например так:
def run(self):
with aLock:
self.clip = subprocess.call([ 'mplayer', 'Avatar.h264'], stdin=subprocess.PIPE)
Это делает для вас пару acquire()/release()
и намного более устойчиво к неожиданным исключениям, возникшим в теле блока with
(Python делает все возможное, чтобы снять блокировку, если тело по какой-либо причине закрывается).