Использование многопроцессорности python с различными случайными затратами для каждого процесса

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

В настоящее время я реализую это следующим образом:

P = mp.Pool(ncpus) # Generate pool of workers
for j in range(nrun): # Generate processes
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp)
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)        
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process
P.close()
P.join() # start processes  

где sim, adatom1 и lattice - объекты, переданные функции run, которая инициирует симуляцию.

Тем не менее, я недавно выяснил, что каждая партия, которую я запускаю одновременно (т.е. каждый ncpus исчерпывает итоговый nrun прогонов моделирования) дает точные результаты.

Может кто-то здесь просветить, как это исправить?

Ответы

Ответ 1

Просто подумал, что добавлю фактический ответ, чтобы дать понять другим.

Цитирование ответа от aix в этом вопросе:

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

Используйте метод random.seed() (или эквивалент scipy/numpy), чтобы правильно установить семя. См. Также этот поток numpy.

Ответ 2

A решение для проблемы заключалось в использовании scipy.random.seed() в функции run, которая назначает новое семя для случайных функций, вызванных из run.

Аналогичная проблема (из которой я получил решение) можно найти в многопроцессорной работе. Как представляется, работа в Windows работает, но не в ubuntu?