Мультипроцессы и замки. Даже при наличии замка присутствуют гонки, так и должно быть?

Примеры использования 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 шт):

Автор решения: Qwertiy

Блокировки нужны не для того, чтобы обекспечить порядок междку блокировками, а для того, чтобы внутри заблокированных блоков не было одновременного исполнения.

Вывод с lock и без lock одинаков.

Добавь несколько команд вывода в заблокированный блок. Причём, добавляй больше или добавляй задержки. Чтобы время между выводами было больше накладных расходов на запуск. Должны перемешаться строки от разных потоков. А если они перемешиваются даже с lock, то ты что-то делаешь не так.

→ Ссылка