Python多处理模块是否需要多核CPU?

时间:2018-03-15 01:33:22

标签: python cpu

我是否需要多核CPU才能利用Python多处理模块? 另外,有人可以告诉我它是如何工作的吗?

1 个答案:

答案 0 :(得分:2)

multiprocessing要求操作系统启动一个或多个新进程,运行相同版本的Python和相同版本的脚本。它还可以设置管道或其他方式直接在它们之间共享数据。

它通常像魔术一样运作;当你在引擎盖下窥视时,有时它看起来像是制作香肠,但你通常可以理解香肠研磨机。 multiprocessing文档可以很好地解释事情(它们很长,但是有很多东西需要解释)。如果您需要更多的知识,那么文档链接到源代码,这是非常易读的Python代码。如果您在阅读后有特定问题,请回到SO并提出具体问题。

与此同时,如果没有多核,您可以获得<{1}}的一些的好处。

main 的好处 - 模块设计的原因 - 是速度的并行性。很明显,如果没有4个内核,您不会将时间减少到25%。但有时,即使使用单核,您实际上也可以获得一点加速,特别是如果该核具有“超线程”或类似技术。我见过时间降到80%,甚至60%。更常见的是,它们会高达108%(因为你确实从超线程中获得了一小部分好处,但是开销成本高于增益)。但请尝试使用您的代码并查看。

与此同时,您将获得所有附带好处:

  • 并发:您可以一次运行多个任务,而不会相互阻塞。当然,线程multiprocessing和其他技术也可以做到这一点。
  • 隔离:您可以同时运行多个任务,而不会有其中一个更改另一个不期望更改的数据的风​​险。
  • 崩溃保护:如果子任务发生了段错误,则只会影响该任务。 (好吧,你还是要小心任何副作用 - 如果它在写一个文件的过程中崩溃,而另一个任务期望形状一致,你仍然有问题。)

您也可以在没有多个进程的情况下使用asyncio模块。有时您只需要模块的更高级API,但是您希望将它与线程一起使用; multiprocessing这样做。并且您可以在几行代码中来回切换以双向测试。或者,如果模型符合您的要求,您可以使用更高级别的multiprocessing.dummy包装器。除了通常更简单之外,它还允许您通过在一行中更改一个单词来在线程和进程之间切换。

此外,围绕concurrent.futures.ProcessPoolExecutor重新设计程序会使您更进一步将其重新设计为在多台独立计算机上运行的分布式系统。它迫使你处理诸如你的任务如何沟通而不能分享所有内容之类的问题,而不会强迫你处理更多问题,比如他们如何在没有可靠联系的情况下进行沟通。