python - 多处理速度越慢,进程越多

标签 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"

最佳答案

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

最明显的问题是您同步所有内容。选择文件是顺序的,因为你锁定了,所以这里的 yield 为零。当您并行读取时,读取的每一行都会写入一个共享数据结构——它将在内部同步。因此,您可能获得的唯一收获是并行阅读。取决于您的媒体,例如HDD 而不是 SSD,多个读取器的总和实际上比单个读取器慢。

最重要的是管理所有这些流程的开销。每一个都需要开始。每个人都需要传递其输入。每个人都必须与其他人交流,这几乎发生在每一个 Action 中。不要被愚弄了,Manager 很漂亮但重量级。

因此,除了 yield 很少之外,您还增加了额外的成本。由于您开始时的运行时间非常短,仅为 7 毫秒,因此额外成本可能会非常可观。

一般来说,multiprocessing 只有在您受 CPU 限制时才值得。也就是说,您的 CPU 效率接近 100%,即工作量超出了可完成的范围。通常,当您进行大量计算时会发生这种情况。通常,主要执行 I/O 是一个很好的指标,表明您受 CPU 限制。

关于python - 多处理速度越慢,进程越多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39933568/

相关文章:

python - 如何将python并行计算(ipython并行或多处理)的结果输出到pandas数据帧?

python - 如何生成范围内所有可能排列的列表

c - 多线程程序未产生所需的输出

java - 线程输出监听器

python - Django、Signals 和另一个进程

python-3.x - 我应该如何设置 spaCy 服务器来处理多个并发请求(非阻塞)?

python - 使用 ">>"和 "&"运算符的变量赋值

python - 日志中的文件不可访问错误 (setuptools)

python - 将 SQL 查询解析为类似 DOM 的树以启用自动排列?

C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'