Многопроцессорная обработка Python для функции с несколькими функциями

Моя функция похожа на определение числа пи с помощью интегрального метода Монте-Карло. Функция в основном вставляет молекулу в случайное положение и оценивает энергию. Я преобразую цикл for в функцию для работы с несколькими ядрами, используя многопроцессорный модуль. однако я получил аналогичные значения от генератора случайных чисел и значения энергии для всех процессов. Похоже, он запускал функцию несколько раз, но сообщал о похожих результатах.

список пользовательских функций. Для простоты нет подробностей.

def createRandomValuesforRotationTranslation(boxSpace):
def rotateTranslateMolec(randomValues,molec):
def makemolgroups(newMolec,peg):
def steric_closmol_clashes_vdw2(boxMolecs,ResID):

Запуск цикла;

nReplicates = 100 
count = 0
throws = 0

for i in range(nReplicates):
    throws += 1
    randomvalues = createRandomValuesforRotationTranslation(boxSpace)
    newMolec = rotateTranslateMolec(randomvalues,rna_mol)
    boxMolecs = makemolgroups(newMolec,peg)
    output = steric_closmol_clashes_vdw2(boxMolecs,ResID)
    count += output
    ratio = count /throws
    # binomial distribution method V_free = (number of accepted/total)Vbox 
    V_free = (count/throws)*output_vol
    p = count/throws
    std_binom = sqrt(throws*p*(1-p))
    error_binom = (output_vol/throws)*std_binom
    error_binom_fraction =  error_binom/V_free
    if i % 1 == 0:
        print("STEPS %d: BINOMIAL ERROR T.VOLUME %s: ERROR F.VOLUME %s: ESTIMATED VOLUME %s:" %(i, error_binom,error_binom_fraction,ratio))

Затем я конвертирую цикл for как;

def paralle_distances(nReplicates): 
    count = 0
    throws = 0
    for i in range(nReplicates):
        throws += 1
        randomvalues = createRandomValuesforRotationTranslation(boxSpace)
        newMolec = rotateTranslateMolec(randomvalues,rna_mol)
        boxMolecs = makemolgroups(newMolec,peg)
        output = steric_closmol_clashes_vdw2(boxMolecs,ResID)
        count += output
        ratio = count /throws
        # binomial distribution method V_free = (number of accepted/total)Vbox 
        V_free = (count/throws)*output_vol
        p = count/throws
        std_binom = sqrt(throws*p*(1-p))
        error_binom = (output_vol/throws)*std_binom
        error_binom_fraction =  error_binom/V_free
        if i % 1 == 0:
            print("STEPS %d: BINOMIAL ERROR T.VOLUME %s: ERROR F.VOLUME %s: ESTIMATED VOLUME %s:" %(i, error_binom,error_binom_fraction,ratio))
    return

import multiprocessing as mp
pool = mp.Pool(processes=4)
results = [pool.apply_async(paralle_distances, args=(x,)) for x in range(1,5)]

Я напечатал случайные значения только здесь.

(( 242.281, -50.4288, -7.54141 ), ( -0.679886, 0.674784, 0.287092 ), 201.097 degree)
(( 242.281, -50.4288, -7.54141 ), ( -0.679886, 0.674784, 0.287092 ), 201.097 degree)
(( 242.281, -50.4288, -7.54141 ), ( -0.679886, 0.674784, 0.287092 ), 201.097 degree)
(( 157.376, 67.453, -132.227 ), ( 0.0216526, 0.765258, 0.64336 ), 16.5297 degree)
(( 157.376, 67.453, -132.227 ), ( 0.0216526, 0.765258, 0.64336 ), 16.5297 degree)
(( 242.281, -50.4288, -7.54141 ), ( -0.679886, 0.674784, 0.287092 ), 201.097 degree)

большое спасибо!

1 ответ

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

Другие вопросы по тегам