python multiprocessing.Process,multiprocessing.Pool区别(不同之处)

前端之家收集整理的这篇文章主要介绍了python multiprocessing.Process,multiprocessing.Pool区别(不同之处)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们知道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 multiprocessing

def eval_formula(formula):
    # 具体任务
    pass

p = multiprocessing.Pool(multiprocessing.cpu_count())
result = p.map(eval_formula, expression_li)
p.close()
p.join()

process代码

from multiprocessing import Process

def eval_formula(formula):
    # 具体任务
    pass

for 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相关文章