
我们知道GIL Lock禁用了Python中的多线程功能。在Python中multiprocessing提供了两个用于多进程的类,即Process和Pool类。在以下各节中,我已对使用pool和process类时的经验进行了简要概述。并使用两个类进行性能比较。我还详细介绍了性能比较,这将有助于为您的多进程任务选择适当的方法。
是否可以批量启动子进程
multiprocessing.Process 无法批量开启子进程
multiprocessing.Pool 可以批量开启子进程
进程间通信
multiprocessing.Process 可以直接用multiprocesssing.Queue等进行通信
multiprocessing.Pool 不能直接用multiprocessing.Queue进行通信,只能通过共享内存,或者用multiprocessing.Manager()进行进程间通信。
Python multiprocessing:Pool和Process类
尽管Pool和Process都可以并行执行任务,但是它们并行执行任务的方式却不同。
该Pool使用FIFO( First input First Output 先进先出)调度将任务分配给可用处理器。它的工作方式类似于map缩减架构。它将输入映射到不同的处理器,并收集所有处理器的输出。执行代码后,它将以列表或数组的形式返回输出。它等待所有任务完成,然后返回输出。执行中的进程存储在内存中,其他未执行的进程存储在内存之外。
Process类将所有进程放入内存中,并使用FIFO策略安排执行时间。进程暂停后,它将抢占并安排新进程执行。
何时使用池和流程
我认为选择合适的方法取决于手头的任务。Pool使您可以在每个进程中执行多个任务,这可以使并行化程序变得更加容易。如果要并行执行一百万个任务,则可以创建一个进程数与cpu核心数量一样多的Pool,然后将一百万个任务的列表传递给pool.map。Pool会将这些任务分发给工作进程(通常与可用内核的数目相同),并以列表的形式收集返回值,并将其传递给父进程。启动单独的一百万个进程将不太实用(这可能会破坏您的OS)。
pool代码
import multiprocessingdef eval_formula(formula): # 具体任务 passp = multiprocessing.Pool(multiprocessing.cpu_count())result = p.map(eval_formula, Expression_li)p.close()p.join()
process代码
from multiprocessing import Processdef eval_formula(formula): # 具体任务 passfor i in range(len(Expression_li)): p=Process(target=eval_formula(eval_formula,args=(Expression_li[i],))) p.start() p.join()
另一方面,如果要并行执行的任务很少,并且每个任务只需要执行一次,那么为每个任务使用单独的multiprocessing.process而不是设置Pool可能是完全合理的。
我们使用Pool和Process类来评估excel表达式。以下是我们对池和进程类的观察:
任务数量
如我们所见,Pool仅在内存中分配正在执行的进程,而Process在内存中分配所有任务,因此,当任务数较小时,我们可以使用Process类;当任务数较大时,我们可以使用Pool。在大型任务中,如果我们使用Process,可能会发生内存问题,从而引起系统干扰。Pool,由于创建它会产生开销,因此,对于较小的任务数,使用Pool会影响性能。
IO *** 作
Pool以FIFO方式在可用内核之间分配进程。在每个内核上,分配的进程按顺序执行。因此,如果有很长的IO *** 作,它将等待IO *** 作完成,并且不会安排其他进程。这导致执行时间增加。Process类则挂起执行IO *** 作的进程并安排另一个进程。因此,在长时间的IO *** 作的情况下,建议使用进程类。
参考:
https://docs.python.org/zh-cn/3.7/library/multiprocessing.HTML?highlight=multiprocessing#the-process-class
以上是内存溢出为你收集整理的python multiprocessing.Process,multiprocessing.Pool区别(不同之处)全部内容,希望文章能够帮你解决python multiprocessing.Process,multiprocessing.Pool区别(不同之处)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)