Когда вы используете fork для создания нового процесса, текущее…

Когда вы используете 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


👉 @BookPython
Просмотры: 3 832
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти