使用更多进程,MultiProcessing更慢

时间:2016-10-08 14:29:20

标签: python multithreading multiprocessing

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

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

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

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"

2 个答案:

答案 0 :(得分:4)

问题在于,看起来像这样的多处理通常不是。仅使用更多核心并不意味着要做更多的工作。

最明显的问题是你同步一切。选择文件是顺序的,因为你锁定,所以这里没有增益。在并行读取时,每行读取都会写入共享数据结构 - 这将在内部同步自身。因此,可能获得的唯一收益来自并行读取。取决于您的媒体,例如硬盘而不是SSD,多个读卡器的总和实际上比单个读卡器慢。

最重要的是管理所有这些流程的开销。每个人都需要启动。每个人都需要传递其输入。每个人都必须与其他人沟通,这几乎是每一个行动都会发生的。不要被愚弄,Manager是漂亮但重量级的。

除了获得少许之外,您还需要额外付费。由于您的运行时间非常短7ms,因此额外费用非常重要。

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

答案 1 :(得分:2)

只是为了添加现有答案,在某些情况下,使用multiprocessing确实可以增加价值并节省时间:

  1. 您的程序执行 N 任务,这些任务彼此独立。
  2. 你的程序进行了大量繁重的数学计算
  3. 作为第二点的问题,计算时间必须要大得多。否则,创建新流程的成本将掩盖多处理的优势,并且您的并行处理设计程序将比顺序版本运行得慢。
  4. 在理想情况下,如果您的程序执行文件I / O,网络I / O操作,那么请不要对您的程序进行并行化,除非您有充分的理由这样做。
  5. 要添加到第四点,如果您的要求需要,那么您可以考虑创建一个multiprocess.Pool,它将根据需要为您执行任务,并消除每次创建和销毁过程的开销。
  6. 希望它对你有所帮助。