首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程越多,MultiProcessing越慢

进程越多,MultiProcessing越慢
EN

Stack Overflow用户
提问于 2016-10-08 14:29:19
回答 2查看 1.7K关注 0票数 2

我有一个用python编写的程序,它读取4个输入文本文件,并将它们全部写入一个名为ListOutput的列表中,这是程序中使用的4个进程之间的共享内存(我使用了4个进程,所以我的程序运行得更快!)

我还有一个名为processedFiles的共享内存变量,它存储任何进程已经读取的输入文件的名称,因此当前进程不会再次读取它们(我使用了锁,这样进程就不会同时检查processedFiles中是否存在文件)。

当我只使用一个进程时,我的程序运行得更快(7毫秒)--我的计算机有8个内核。为什么会这样呢?

代码语言:javascript
复制
import glob
from multiprocessing import Process, Manager,Lock
import timeit
import os

os.chdir("files")
# Define a function for the Processes
def print_content(ProcessName,processedFiles,ListOutput,lock):
   for file in glob.glob("*.txt"):
      newfile=0

      lock.acquire()

      print "\n Current Process:",ProcessName

      if file not in processedFiles:
         print "\n", file, " not in ", processedFiles," for ",ProcessName
         processedFiles.append(file)
         newfile=1 #it is a new file

      lock.release()

      #if it is a new file
      if newfile==1:
         f = open(file,"r")
         lines = f.readlines()
         ListOutput.append(lines)
         f.close()

         #print "%s: %s" % ( ProcessName, time.ctime(time.time()) )

# Create processes as follows
try:
   manager = Manager()
   processedFiles = manager.list()
   ListOutput = manager.list()
   start = timeit.default_timer()

   lock=Lock()
   p1 = Process(target=print_content, args=("Procees-1",processedFiles,ListOutput,lock))
   p2 = Process(target=print_content, args=("Process-2",processedFiles,ListOutput,lock))
   p3 = Process(target=print_content, args=("Process-3",processedFiles,ListOutput,lock))
   p4 = Process(target=print_content, args=("Process-4",processedFiles,ListOutput,lock))

   p1.start()
   p2.start()
   p3.start()
   p4.start()

   p1.join()
   p2.join()
   p3.join()
   p4.join()

   print "ListOutput",ListOutput
   stop = timeit.default_timer()
   print stop - start
except:
   print "Error: unable to start process"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-08 14:51:32

问题是,看起来像多重处理的东西通常不是,仅仅使用更多的内核并不意味着要做更多的工作。

最突出的问题是同步所有的东西。选择文件是连续的,因为您锁定,所以这里有零增益。当您并行读取时,每一行读取都被写入一个共享数据结构--这将在内部同步它自己。所以你唯一可能得到的好处就是并行阅读。根据您的媒体,例如HDD而不是SSD,多个读取器的总和实际上比单个读取器慢。

最重要的是管理所有这些进程的开销。每一个都需要开始。每个人都需要传递自己的意见。每个人都必须与其他人沟通,这几乎发生在每一个行动中。别被愚弄了,Manager很漂亮,但却是重量级。

因此,除了获得很少的收益外,你还增加了额外的成本。由于您从一个非常小的7ms运行时开始,那么额外的成本可能会相当大。

一般来说,只有当你是CPU绑定时,multiprocessing才是值得的.也就是说,您的CPU效率接近100%,也就是说有更多的工作可以做。通常,当你做大量的计算时,就会发生这种情况。通常,主要做I/O是一个很好的指标,表明你没有CPU限制。

票数 5
EN

Stack Overflow用户

发布于 2016-10-08 15:05:37

为了补充现有的答案,在某些情况下,使用multiprocessing确实增加了价值并节省了时间:

  1. 您的程序执行N个任务,这些任务彼此独立。
  2. 你的程序做大量的数学计算。
  3. 至于第二点,计算时间必须要大得多。否则,创建新进程的成本将掩盖多处理的优势,而您设计的并行处理程序的运行速度将比顺序版本慢。
  4. 在理想的情况下,如果您的程序确实有文件I/O,网络I/O操作,那么就不要并行化您的程序,除非您有很强的理由这样做。
  5. 为了补充第四点,如果您的需求需要,那么您可以考虑创建一个multiprocess.Pool,它将根据需要为您执行任务,并消除了每次创建和销毁流程的开销。

希望它能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39933568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档