这可能是一个简单的问题,但通过阅读文档,博客和谷歌搜索几天后,我还没有找到一个直截了当的答案。
在python中使用multiprocessing
模块(https://docs.python.org/3/library/multiprocessing.html)时,模块是否在给定处理器/核心数之间均匀分配工作?
更具体地说,如果我在具有四个处理器的本地计算机上进行开发工作,并且我编写了一个使用multiprocessing
执行六个函数的函数,那么它们中的三个或四个并行运行,然后是其他函数什么东西结束后运行?而且,当我使用六个处理器将其部署到生产环境时,所有六个处理器并行运行吗?
我试图理解我需要多少指导多处理库。我在代码示例中没有看到任何方向,所以我假设已经处理了。我想确保我可以安全地在多种环境中使用它。
修改
经过一番评论后,我想澄清一下。我可能误会了什么。
我想要同时运行几个不同的功能。我希望每个函数都在自己的核心上运行。速度非常重要。我的问题是:"如果我有五个功能,只有四个核心,这是如何处理的?"
谢谢。
答案 0 :(得分:0)
简短的答案是,如果您不指定进程数量,则默认值为产生机器所拥有的内核数量一样的进程,如multiprocessing.cpu_count()
所示。
长答案是,这取决于您如何创建子流程...
如果创建一个Pool对象,然后将该对象与地图,星图或类似功能一起使用,将如上所述创建“ cpu_count”个进程。或者,您可以使用 processes 参数指定要生成的不同数量的子流程。然后,地图功能会将工作分配给那些流程。
with multiprocessing.Pool(processes=N) as pool:
rets = pool.map(func, args)
通过map函数分配工作的方式可能会有些复杂,如果您对性能的要求足够高,以至于真正关心分块等,那么最好阅读the docs。
还有其他一些库可以帮助管理更高级别的并行处理,并且具有很多选项,例如Joblib和parmap。同样,最好阅读文档。
如果您特别想启动与您拥有的作业数量相等的进程数量,并且不在乎它可能大于计算机中的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()
考虑上面的示例伪代码。您将无法复制粘贴内容并期望它能正常工作。除非您使用相同的参数启动同一函数的多个实例。