#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
является будущим.