Python: как не дать нескольким процессам одновременно полезть в один ресурс
В 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() — так блокировка гарантированно снимется даже при исключении.
В 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() — так блокировка гарантированно снимется даже при исключении.