我的功能类似于使用蒙特卡罗积分法确定pi值。该功能基本上将分子插入随机位置并估算能量。我在函数中转换for循环以使用多处理模块在多个核上运行。但是我从随机数发生器和所有过程的能量值中得到了相似的值。看起来它多次运行该功能但报告类似的结果。
用户定义函数列表。为简单起见,没有详细说明。
def createRandomValuesforRotationTranslation(boxSpace):
def rotateTranslateMolec(randomValues,molec):
def makemolgroups(newMolec,peg):
def steric_closmol_clashes_vdw2(boxMolecs,ResID):
运行for循环;
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)
非常感谢!
答案 0 :(得分:1)
我的直觉反应是建议使用传递给每个线程的值x
作为随机数生成器的种子,确保每个线程中都有一个单独的生成器实例。如果您使用的生成器不能保证线程安全,那么可能成为您的问题。