用于CPU /内存优化的Python多处理过程与池

时间:2014-12-13 02:32:16

标签: python multithreading multiprocessing

我正在进行并发编程,我注意到以下内容:

版本1 multiprocessing.Process():

# huge_df is a giant pandas.DataFrame(), i.e. 1 billion rows, 50 cols
mgr_dict = multiprocessing.Manager().dict()
jobs = [ multiprocessing.Process(target=worker, args=(huge_df, mgr_dict, i) for in in xrange(2000) ]
for j in jobs:
    j.start()
for j in jobs:
    j.join()
# blows out all my cores, grinds server to a halt

版本2 multiprocessing.Pool():

# huge_df is a giant pandas.DataFrame(), i.e. 1 billion rows, 50 cols
mgr_dict = multiprocessing.Manager().dict()
args_iterable = [ (huge_df, mgr_dict, i) for i in xrange(2000) ]
pool = multiprocessing.Pool()
pool.map(worker, args_iterable)  # worker in this example deconstructs tuple into separate vars
pool.close()
pool.join()
# takes a very long time to begin using fully allotted CPU resources

因此,我想知道:

  1. 例如multiprocess.Process是否共享相同的'huge_df',而multiprocess.Pool为每个进程选择它?即是multiprocess.Pool较慢,因为它是I / O绑定而这个huge_df被复制到每个进程?我注意到每个线程最终需要大约相等的内存量。 (或者,multiprocess.Process实际上是否锁定了共享数据,因此一次只能有一个线程使用它,甚至是只读的?)
  2. 如果我在1中的推定是正确的,那么是否有:
    • 用于限制一次运行的multiprocessing.Process()的数量的习惯用法?
    • 一种在多个multiprocessing.Pool()进程之间共享huge_df的方法(也是符合OOP的,即不是全局变量)?

0 个答案:

没有答案