Python Glossary English

все 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Сообщить о неточности