Мультипроцессы и замки. Даже при наличии замка присутствуют гонки, так и должно быть?
Примеры использования lock c мультипроцессами, как в документации Phyton, так и в интернете, не обеспечивают защиту от гонок, при воспроизведении мной - вывод примера идет не в постоянном порядке, а при каждом запуске порядок вывода случайный. Обеспечить постоянный порядок согласно списку можно только добавлением p.join() в конце, но тогда lock теряет смысл. В чем причина? Потратил много времени, не понимаю. Пример 1 взят с http://python-3.ru/page/multiprocessing.
from multiprocessing import Process, Lock
def printer(item, lock):
"""
Выводим то что передали
"""
lock.acquire()
try:
print(item)
finally:
lock.release()
if __name__ == '__main__':
lock = Lock()
items = ['tango', 'foxtrot', 10]
for item in items:
p = Process(target=printer, args=(item, lock))
p.start()
Пример кода из документации (https://python.readthedocs.io/en/stable/library/multiprocessing.html#exchanging-objects-between-processes) - 17.2.1.4. Synchronization between processes
from multiprocessing import Process, Lock
def f(l, i):
l.acquire()
try:
print('hello world', i)
finally:
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
Ответы (1 шт):
Блокировки нужны не для того, чтобы обекспечить порядок междку блокировками, а для того, чтобы внутри заблокированных блоков не было одновременного исполнения.
Вывод с lock и без lock одинаков.
Добавь несколько команд вывода в заблокированный блок. Причём, добавляй больше или добавляй задержки. Чтобы время между выводами было больше накладных расходов на запуск. Должны перемешаться строки от разных потоков. А если они перемешиваются даже с lock, то ты что-то делаешь не так.