【问题标题】:Multiprocessing in pythonpython中的多处理
【发布时间】:2014-07-04 13:35:11
【问题描述】:

我正在编写一个 Python 脚本 (in Python 2.7),其中我需要在一个范围内生成大约 500,000 个统一随机数。我需要这样做 4 次,对它们进行一些计算并写出 4 个文件。

目前我在做:(this is just part of my for loop, not the entire code)

random_RA = []
for i in xrange(500000):
    random_RA.append(np.random.uniform(6.061,6.505)) # FINAL RANDOM RA 

random_dec = []
for i in xrange(500000):
    random_dec.append(np.random.uniform(min(data_dec_1),max(data_dec_1))) # FINAL RANDOM 'dec'

生成范围内的随机数。我正在运行 Ubuntu 14.04,当我运行该程序时,我还会打开我的系统管理器来查看我拥有的 8 个 CPU 是如何工作的。我似乎注意到,当程序运行时,8 个 CPU 中只有 1 个似乎以 100% 的效率工作。所以整个程序需要我大约 45 分钟才能完成。

我注意到使用模块 Multiprocessing 可以充分利用所有 CPU 资源

我想知道在我的示例中这是否足够:

random_RA = []
for i in xrange(500000): 
    multiprocessing.Process()
    random_RA.append(np.random.uniform(6.061,6.505)) # FINAL RANDOM RA

即只添加multiprocessing.Process()这一行,够吗?

【问题讨论】:

  • @AleksanderLidtke 我确实读过它,我认为上述方法可能有效。但在尝试之前,我想知道它是否会来自专家
  • 回答您的问题:这绝对不够
  • @freakish 我该怎么做?
  • @Srivatsan 从阅读文档开始。您需要将一个函数传递给Process() 构造函数。但是有太多细节无法解释。阅读 Aleksander 提供的文档。

标签: python python-2.7 multiprocessing


【解决方案1】:

如果您使用多处理,则应尽可能避免共享状态(如您的random_RA 列表)。 相反,尝试使用Pool 及其map 方法:

from multiprocessing import Pool, cpu_count

def generate_random_ra(x):
    return np.random.uniform(6.061, 6.505)

def generate_random_dec(x):
    return np.random.uniform(min(data_dec_1), max(data_dec_1))

pool = Pool(cpu_count())
random_RA = pool.map(generate_random_ra, xrange(500000))
random_dec = pool.map(generate_random_dec, xrange(500000))

【讨论】:

    【解决方案2】:

    让您开始:

    import multiprocessing
    import random
    
    def worker(i):
        random.uniform(1,100000)
        print i,'done'
    
    
    if __name__ == "__main__":
        for i in range(4):
            t = multiprocessing.Process(target = worker, args=(i,))
            t.start()
        print 'All the processes have been started.'
    

    您必须用__name__ == "__main__"t = multiprocess.Process(...) 进行门控,因为每个工作人员再次调用此程序(模块)以了解它必须做什么。如果门控没有发生,它会产生更多的进程......

    为了完整起见,生成 500000 个随机数不会花费您 45 分钟,因此我假设这里正在进行一些密集计算:您可能需要仔细查看它们。

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 2016-09-21
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2016-05-30
      相关资源
      最近更新 更多