python中具有未知数量处理器的多处理

时间:2017-07-29 16:04:31

标签: python python-3.x asynchronous parallel-processing multiprocessing

这可能是一个简单的问题,但通过阅读文档,博客和谷歌搜索几天后,我还没有找到一个直截了当的答案。

在python中使用multiprocessing模块(https://docs.python.org/3/library/multiprocessing.html)时,模块是否在给定处理器/核心数之间均匀分配工作?

更具体地说,如果我在具有四个处理器的本地计算机上进行开发工作,并且我编写了一个使用multiprocessing执行六个函数的函数,那么它们中的三个或四个并行运行,然后是其他函数什么东西结束后运行?而且,当我使用六个处理器将其部署到生产环境时,所有六个处理器并行运行吗?

我试图理解我需要多少指导多处理库。我在代码示例中没有看到任何方向,所以我假设已经处理了。我想确保我可以安全地在多种环境中使用它。

修改

经过一番评论后,我想澄清一下。我可能误会了什么。

我想要同时运行几个不同的功能。我希望每个函数都在自己的核心上运行。速度非常重要。我的问题是:"如果我有五个功能,只有四个核心,这是如何处理的?"

谢谢。

1 个答案:

答案 0 :(得分:0)

简短的答案是,如果您不指定进程数量,则默认值为产生机器所拥有的内核数量一样的进程,如multiprocessing.cpu_count()所示。

长答案是,这取决于您如何创建子流程...

如果创建一个Pool对象,然后将该对象与地图,星图或类似功能一起使用,将如上所述创建“ cpu_count”个进程。或者,您可以使用 processes 参数指定要生成的不同数量的子流程。然后,地图功能会将工作分配给那些流程。

with multiprocessing.Pool(processes=N) as pool:
    rets = pool.map(func, args)

通过map函数分配工作的方式可能会有些复杂,如果您对性能的要求足够高,以至于真正关心分块等,那么最好阅读the docs

还有其他一些库可以帮助管理更高级别的并行处理,并且具有很多选项,例如Joblibparmap。同样,最好阅读文档。

如果您特别想启动与您拥有的作业数量相等的进程数量,并且不在乎它可能大于计算机中的cpus数量。您可以使用Process对象而不是Pool对象。该接口与线程库可用于并发的方式相似。

jobs = []
for _ in range(num_jobs):
    job = multiprocessing.Process(target=func, args=args)
    job.start()
    jobs.append(job)

# wait for them all to finish
for job in jobs:
    job.join()

考虑上面的示例伪代码。您将无法复制粘贴内容并期望它能正常工作。除非您使用相同的参数启动同一函数的多个实例。