все Python 3multiprocessingфункция
multiprocessing.Value()
общая память
Создаёт одно значение ctypes в общей памяти, видимое всем процессам; по умолчанию обёрнуто блокировкой. Доступ — через .value.
Синтаксис
v = ctx.Value(typecode_or_type, *args, lock=True); with v.get_lock(): v.value += 1
Главная ловушка: v.value += 1 не атомарно даже с lock=True — встроенная блокировка защищает отдельно чтение и отдельно запись, и параллельные процессы теряют приращения. Для чтения-изменения-записи нужен with v.get_lock(). Тип задаётся кодом как в array: 'i' — int, 'd' — double, 'c' — один байт; переполнение 'i' молча заворачивает число. lock=False возвращает голый ctypes-объект без get_lock().
Примеры
import multiprocessing as mp
def add(v):
for _ in range(500):
with v.get_lock(): # без неё += теряет приращения
v.value += 1
if __name__ == '__main__':
ctx = mp.get_context('spawn')
v = ctx.Value('i', 0)
ps = [ctx.Process(target=add, args=(v,)) for _ in range(2)]
for p in ps:
p.start()
for p in ps:
p.join()
print(v.value) # → 1000
import multiprocessing as mp
if __name__ == '__main__':
ctx = mp.get_context('spawn')
print(ctx.Value('d', 1.5).value) # → 1.5
print(type(ctx.Value('i', 0)).__name__) # → Synchronized
print(hasattr(ctx.Value('i', 0, lock=False), 'get_lock')) # → False
big = ctx.Value('i', 2**31 - 1)
big.value += 1
print(big.value) # → -2147483648 — переполнение без ошибки
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности