У меня странная вещь: я написал программу для моделирования экономики. Вместо того, чтобы запускать эту симуляцию один за другим на одном ядре процессора, я хочу использовать многопроцессорную обработку, чтобы ускорить работу. Поэтому я запускаю свой код (отлично), и я хочу получить некоторые статистические данные из симуляций, которые я делаю. Затем возникает один сюрприз: все симуляции, сделанные в то же время, дают тот же результат! Есть ли какие-то странные отношения между 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 получить мою голову вокруг этого, отсюда мой пост ...
Большое спасибо за то, что нашли время, чтобы прочитать этот длинный пост, не стесняйтесь задавать больше вопросов!
Все самое лучшее,
В каком случае вы используете 'random' и как? –
Да Reut, я использую random LOT в функции process(), поэтому я не вдавался в подробности ... Спасибо Oleh, я посмотрю документацию! Это все еще самая странная вещь, поскольку целевая функция имеет разные входные данные ... Спасибо! –