【问题标题】:python multiprocessing to a function with multiple functionspython多处理到具有多个函数的函数
【发布时间】:2015-02-14 07:57:44
【问题描述】:

我的函数类似于使用蒙特卡洛积分法确定 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)

非常感谢!

【问题讨论】:

  • 您确定您的功能实现正确吗?
  • 这就是我在这里问的原因。寻找更好的方法来运行脚本。有什么建议吗?

标签: python python-2.7 ipython python-multiprocessing ipython-parallel


【解决方案1】:

我的直觉是建议使用传递给每个线程的值x 作为随机数生成器的种子,确保每个线程中都有一个单独的生成器实例。如果您使用的生成器不能保证是线程安全的,这可能是您的问题。

【讨论】:

  • 我有点不知道该怎么做。
  • 如果你使用numpy.random,你可以在paralle_distances()函数中使用numpy.random.seed(nReplicates)
  • 如果我运行一个带有循环的函数,那么它不会打印相同的值。但是我没有使用 numpy。
猜你喜欢
  • 2014-03-24
  • 2019-07-31
  • 2011-05-26
  • 1970-01-01
  • 2021-05-14
  • 2017-03-24
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
相关资源
最近更新 更多