tornado.locks.Освобождение блокировки

#python #tornado

#python #tornado

Вопрос:

Пример tornado дает следующий пример для блокировок:

 >>> from tornado import gen, locks
>>> lock = locks.Lock()
>>>
>>> @gen.coroutine
... def f():
...    with (yield lock.acquire()):
...        # Do something holding the lock.
...        pass
...
...    # Now the lock is released.
 

Нужно ли снимать блокировку вручную после with или это цель использования оператора with в этом блоке? Если это так, то почему существует отдельный release() и нужно ли предоставлять эту функцию?

Ответ №1:

Правильно, with оператор гарантирует, что блокировка будет снята, нет необходимости вызывать release себя.

release естественно, неблокирующий — ваша сопрограмма может завершить вызов release , не дожидаясь каких-либо других сопрограмм — поэтому release не требует yield инструкции. Вы можете определить это для себя, заметив возвращаемое значение release is None , тогда как возвращаемое значение acquire является будущим.