fork для создания нового процесса, текущее состояние генератора случайных чисел (включая seed) копируется в дочерний процесс. Это может привести к тому, что разные процессы будут генерировать одинаковые «случайные» значения.Чтобы избежать этого, необходимо вручную вызывать
random.seed() в каждом процессе.Однако, если вы используете модуль
multiprocessing, он уже автоматически выполняет это за вас.Пример:
import multiprocessing
import random
import os
import sys
def test(a):
print(random.choice(a), end=' ')
a = [1, 2, 3, 4, 5]
# Вызов в основном процессе
for _ in range(5):
test(a)
print()
# Вызов с multiprocessing.Process
for _ in range(5):
p = multiprocessing.Process(
target=test, args=(a,)
)
p.start()
p.join()
print()
# Вызов с использованием os.fork
for _ in range(5):
pid = os.fork()
if pid == 0:
test(a)
sys.exit()
else:
os.wait()
print()
Вывод будет примерно такой:
4 4 4 5 5
1 4 1 3 3
2 2 2 2 2
Причём, начиная с Python 3.7,
os.fork также использует механизм at_fork hook, который переинициализирует генератор случайных чисел, как и multiprocessing.Так что в Python 3.7+ вывод кода выше может быть таким:
1 2 2 1 5
4 4 4 5 5
2 4 1 3 1
📲 Мы в MAX
👉@BookPython