A-A+

python 多进程与池任务处理 比较分析 Pool vs Process解析

2018年12月25日 10:42 汪洋大海 暂无评论 阅读 48 views 次

Python多处理:池与过程 - 比较分析

Python多处理简介 

多处理是提高性能的好方法。当我们完成使用python代码评估数百万个excel表达式的任务时,我们遇到了Python Multiprocessing。在这种情况下,连续评估表达式变得不谨慎和耗时。

所以,我们决定使用Python Multiprocessing。

通常,在多处理中,您可以使用进程或线程执行任务。为了更好地利用多处理,我们决定使用线程。但在进行研究时,我们知道GIL Lock会禁用Python中的多线程功能。在进一步挖掘时,我们知道Python提供了两个用于多处理的类,即Process和Pool类。在以下部分中,我讲述了使用池和流程类时我们的经验的简要概述。并使用两个类进行性能比较。我还详细介绍了性能比较,这将有助于为多处理任务选择合适的方法。

 

Python多处理:Pool和Process类

尽管Pool和Process都是并行执行任务,但它们并行执行任务的方式却不同。

池使用FIFO调度将任务分配给可用的处理器。它的工作方式类似于地图缩减架构。它将输入映射到不同的处理器并收集所有处理器的输出。执行代码后,它以列表或数组的形式返回输出。它等待所有任务完成,然后返回输出。执行中的进程存储在存储器中,而其他非执行进程则存储在存储器之外。

Python多处理 - 池处理

进程类将所有进程放入内存并使用FIFO策略调度执行。当进程暂停时,它会抢占并安排新的执行进程。

何时使用池和流程

我认为选择合适的方法取决于手头的任务。池允许您为每个进程执行多个作业,这可以使您更轻松地并行化您的程序。如果要并行执行一百万个任务,则可以创建一个池,其中包含与CPU内核一样多的进程数,然后将百万个任务列表传递给pool.map。池将这些任务分发给工作进程(通常与可用内核的数量相同),并以列表的形式收集返回值并将其传递给父进程。启动单独的百万个流程将不太实际(它可能会破坏您的操作系统)。

 

Python多处理 - 池代码

 

Python多处理 - 进程代码

 

池过程 

另一方面,如果您有少量任务要并行执行,并且您只需要完成一次任务,那么为每个任务使用单独的multiprocessing.process可能是完全合理的,而不是设置池。

我们使用Pool和Process类来评估excel表达式。以下是我们对池和流程类的观察:

  1. 任务编号

正如我们所看到的,Pool只在内存中分配执行进程,进程在内存中分配所有任务,因此当任务数量很小时,我们可以使用进程类,当任务数量很大时,我们可以使用pool。在大型任务的情况下,如果我们使用进程,则可能发生内存问题,从而导致系统干扰。在Pool的情况下,创建它有开销。因此,对于较小的任务编号,使用Pool时性能会受到影响。

  1. IO操作

池以FIFO方式在可用内核之间分配进程。在每个核心上,分配的进程按顺序执行。因此,如果存在长IO操作,则等待IO操作完成并且不安排另一个进程。这导致执行时间的增加。Process类暂停执行IO操作的进程并调度另一个进程。因此,在长IO操作的情况下,建议使用进程类。

Python多处理:性能比较

在我们的例子中,使用Pool类的性能如下:

1)使用池 - 6秒

2)不使用池 - 10秒

Process()通过为要运行的每个并行进程启动独立的系统进程来工作。当我们使用Process类时,我们观察到机器干扰,因为创建了100万个进程并将其加载到内存中。

为了进一步测试,我们减少了每个表达式中的参数数量,并运行了100个表达式的代码。

使用Pool类的性能如下:

1)使用pool-4secs

2)不使用池-3秒

然后,我们将参数增加到250并执行这些表达式。

使用Pool类的性能如下:

1)使用池 - 0.6秒

2)不使用池-3秒

总而言之,当有更多进程和小IO等待时,池类可以更好地工作。当进程数量很少且IO操作很长时,进程类工作得更好。您对Python多处理的体验是什么?我很乐意就此展开对话。

文章来源:https://www.ellicium.com/python-multiprocessing-pool-process/

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×
标签:

给我留言