Я думаю, что причина нет ничего стандартная библиотека - потому что для того, чтобы она была там, ей нужно было бы получить гарантии доступа к чугуну. Чтобы обеспечить что-либо меньшее, вы получите ложное чувство безопасности, которое может привести к решению многих параллельных проблем.
Также почти невозможно сделать эти гарантии, не принося существенных жертв. Таким образом, пользователю остается решить, как они будут управлять проблемами параллелизма. Это соответствует одной из философов Python: «Мы все соглашаемся с взрослыми». То есть, если вы пишете класс, я думаю, что разумно, что вы должны знать, какие атрибуты вам нужны, чтобы получить блокировку перед доступом к атрибуту. Или, если вы действительно так обеспокоены, напишите класс wrapper/proxy, который контролирует весь доступ к базовому объекту.
В вашем примере существует несколько способов, с помощью которых целевой объект мог случайно уйти. Если программист не обращает достаточного внимания на код, который они пишут/поддерживает, то этот HiddenLock
может обеспечить это ложное чувство безопасности. Например:
with the_lock as obj:
pass
obj.func() # erroneous
with the_lock as obj:
return obj.func() # possibly erroneous
# What if the return value of `func' contains a self reference?
with the_lock as obj:
obj_copy = obj[:]
obj_copy[0] = 2 # erroneous?
Этот последний особенно пагубный. Является ли этот код безопасным потоком, зависит не от кода внутри блока с блоком, либо даже от кода после блока. Вместо этого это реализация класса obj
, который будет означать, что этот код является потокобезопасным или нет. Например, если obj
является list
, тогда это безопасно, так как obj[:]
создает копию. Однако, если obj
является numpy.ndarray
, тогда obj[:]
создает представление, и поэтому операция небезопасна.
Фактически, если содержимое obj
было изменчивым, то это может быть небезопасным как независимо (например, obj_copy[0].mutate()
).
Значение требует, чтобы замок приобретается, прежде чем что-то доступ? Не совсем то, что у вас есть, - это ожидаемое решение, создайте для него интерфейс (т. Е. Класс). Вместо прямого доступа к списку вы переходите через интерфейс класса. – danny
Как далеко вы хотите защитить доступ? Что делать, если объект передается в другой поток или продолжается доступ после завершения блока? – Dunes
@ Dunes: Просто против случайного забвения. Я не думаю, что можно сделать больше, чем в Python. –