В
multiprocessing процессы работают параллельно и иногда пытаются одновременно изменить один и тот же ресурс.Для таких случаев есть
Lock:
from multiprocessing import Process, Lock
def printer(item, lock):
with lock:
print(item)
Дальше один и тот же
lock передаётся всем процессам:
if __name__ == "__main__":
lock = Lock()
for item in ["tango", "foxtrot", 10]:
Process(
target=printer,
args=(item, lock)
).start()
Пока один процесс находится внутри
with lock:, остальные ждут.Это особенно полезно при работе с файлами, логами, общими структурами и другими ресурсами, где одновременная запись может привести к race condition.
И лучше использовать
with lock:, а не вручную acquire() / release() — так блокировка гарантированно снимется даже при исключении.


