2014-12-13 1 views
0

У меня странная вещь: я написал программу для моделирования экономики. Вместо того, чтобы запускать эту симуляцию один за другим на одном ядре процессора, я хочу использовать многопроцессорную обработку, чтобы ускорить работу. Поэтому я запускаю свой код (отлично), и я хочу получить некоторые статистические данные из симуляций, которые я делаю. Затем возникает один сюрприз: все симуляции, сделанные в то же время, дают тот же результат! Есть ли какие-то странные отношения между Pool() и random.seed()?Многопроцессорность, объединение и случайность

Чтобы быть гораздо яснее, здесь является то, что код можно резюмировать следующим образом:

class Economy(object): 
    def __init__(self,i): 
     self.run_number = i 
     self.Statistics = Statistics() 
     self.process() 

def run_and_return(i): 
    eco = Economy(i) 
    return eco 

collection = [] 
def get_result(x): 
    collection.append(x) 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    for i in range(NRUN): 
     pool.apply_async(run_and_return, (i,), callback=get_result) 
    pool.close() 
    pool.join() 

Процесс (I) является функцией, которая проходит через каждый шаг моделирования, во время я шагов. В основном я имитирую NRUN Economies, из которого получаю статистику, которую я ввел в список.

Теперь странно, что выход этого точно так же для первых 4 запусков: во время той же «волны» симуляций я получаю тот же результат. Как только я доберусь до второй волны, я получаю другой результат для следующих 4 симуляций!

Все эти симуляции работают хорошо, если я использую одну и ту же программу с процессами = 1: у меня разные результаты, когда я работаю только на одном ядре, используя симуляции один за другим ... Я пробовал несколько вещей, но могу " t получить мою голову вокруг этого, отсюда мой пост ...

Большое спасибо за то, что нашли время, чтобы прочитать этот длинный пост, не стесняйтесь задавать больше вопросов!

Все самое лучшее,

+1

В каком случае вы используете 'random' и как? –

+0

Да Reut, я использую random LOT в функции process(), поэтому я не вдавался в подробности ... Спасибо Oleh, я посмотрю документацию! Это все еще самая странная вещь, поскольку целевая функция имеет разные входные данные ... Спасибо! –

ответ

2

Если вы на Linux, то каждый процесс пула осуществляется разветвление родительского процесса. Это означает, что процесс буквально дублируется - это включает в себя семя, которое может использовать любой случайный объект.

Случайный модуль выбирает семена для своих функций по умолчанию при импорте. Значение семени уже было выбрано до создания пула.

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

Пригодный способ посева random будет использовать идентификатор процесса и текущее время. Идентификатор процесса должен быть уникальным при одном запуске вашей программы. Хотя использование времени обеспечит уникальность при нескольких прогонах в случае создания одного и того же идентификатора процесса. Передача id и времени процесса в виде строки будет означать, что дайджест строки также используется для засева генератора случайных чисел - это означает, что две аналогичные строки будут генерировать существенно разные семена. Кроме того, вы можете использовать модуль uuid для генерации семян.

def proc_init(): 
    random.seed(str(os.getpid()) + str(time.time())) 

pool = Pool(num_procs, initializer=proc_init) 
+0

Скорее всего, я на Linux! Так что теперь мне просто нужно проверить, как установить конкретное случайное семя для каждого процесса ... Спасибо! –

+0

Спасибо за ваши замечания ... но это по-прежнему самое странное: у меня есть разные семена для каждого рабочего в пуле, но выход Economy для одной и той же «волны» num_procs по-прежнему остается одинаковым во всех прогонах. .. когда семена нет! Я уверен, что это не из моего кода, потому что если я запустил его с num_procs = 1, я получаю разные результаты ... Очень странно! –

+0

Я бы не согласился.Мне кажется, что существует какое-то начальное состояние, которое мутируется каждым пробегом Economy. Существует предположение, что Economy будет выполняться последовательно, чтобы все выполнялось с началом с другого состояния. Вместо этого начальное состояние копируется на все рабочие процессы. Все они начинаются в одном и том же состоянии, поэтому все они производят одинаковый результат. Не зная внутренности «статистики» и «экономики», я не могу сказать, откуда это дублируемое состояние (если не из «случайного»). – Dunes

 Смежные вопросы

  • Нет связанных вопросов^_^