首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重用进程池用于Python 3中的并行编程

如何重用进程池用于Python 3中的并行编程
EN

Stack Overflow用户
提问于 2016-01-01 03:59:48
回答 1查看 3.8K关注 0票数 11

我刚开始并行编程。我的任务是分析数百个数据文件。这些数据中的每一个都是近300 of,并且可以被分割成多个切片。我的电脑是一台四核电脑.我想尽快得到每个数据的结果。

每个数据文件的分析由两个步骤组成。首先,将数据读入内存,然后将其切片,这是一项非常繁重的工作。然后,对这个文件的片进行大量的计算,这是cpu密集型的。

因此,我的策略是将这些文件分组为4组。首先,将4个文件的所有数据读入4个核心的4个进程的内存中。密码就像,

代码语言:javascript
复制
with Pool(processes=4) as pool:
    data_list = pool.map(read_and_slice, files)  # len(files)==4

然后,对于data中的每个data_list,用4个进程进行计算。

代码语言:javascript
复制
for data in data_list:  # I want to get the result of each data asap
    with Pool(processes=4) as pool:
        result_list = pool.map(compute, data.slices)  # anaylyze each slice of data
    analyze(result_list)  # analyze the results of previous procedure, for example, get the average.

然后再去找另一组。

所以问题是,在计算数百个文件的整个过程中,这个池被多次重新创建。如何避免重新创建池和进程的开销?我的代码中是否存在大量内存开销?还有什么更好的方法让我尽量少花时间吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-01 17:54:19

一种选择是将with Pool语句移出for循环…之外。

代码语言:javascript
复制
p = Pool()
for data in data_list:
  result_list = pool.map(compute, data.slices)
  analyze(result_list)
p.join()
p.close()

这适用于python 2或3。

如果您安装(我的模块) pathos,然后执行from pathos.pools import ProcessPool as Pool,并保持代码的其余部分与您拥有的完全相同--您将只创建一个Pool。这是因为pathos缓存Pool,当创建具有相同配置的新Pool实例时,它只是重用现有实例。您可以执行一个pool.terminate()来关闭它。

代码语言:javascript
复制
>>> from pathos.pools import ProcessPool as Pool
>>> pool = Pool()
>>> data_list = [range(4), range(4,8), range(8,12), range(12,16)]
>>> squared = lambda x:x**2
>>> mean = lambda x: sum(x)/len(x)
>>> for data in data_list:
...   result = pool.map(squared, data)
...   print mean(result)
... 
3
31
91
183

实际上,pathos使您能够执行嵌套池,因此您还可以将for循环转换为异步映射(amap from pathos)…。由于内部映射不需要保留顺序,所以可以使用无序映射迭代器(imap_unordered in multiprocessing,或uimap from pathos)。有关示例,请参见此处:https://stackoverflow.com/questions/28203774/how-to-do-hierarchical-parallelism-in-ipython-parallelhttps://stackoverflow.com/a/31617653/2379433

唯一令人沮丧的是pathospython2。但不久(即将发布)将完全转换为python3

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34553424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档