Python - 无法启动新线程,这是我的错,我无法弄清楚如何修复它

时间:2016-10-11 20:23:20

标签: python multithreading queue

我发现了其他与此相似的问题,但它们有些微妙的不同,我无法弄清楚如何回答我自己的问题......我知道我创造了太多线程我只是不知道如何阻止它!

我有一个例程,通过循环遍历每个构建来处理软件构建(假设构建的最大数量是10);对于每个构建,我遍历两个平台(win64,lnx64),对于每个平台,我遍历三个目录(10 x 2 x 3 = 60个目录)。

对于每个目录,我将文件从一个网络位置复制到另一个网络位置。为了复制文件,我使用了一个名为bld_copy.py的文件,该文件有一个名为cpBuild(sourceDir,DestinationDir)的函数(导入调用例程)。

cpBuild将在sourceDir中构建一个文件列表(使用os.path.walk)和DestinationDir中的相关文件列表,并使用队列和线程来复制文件。 cpBuild函数是一个通用函数,从需要将代码从A复制到B的其他文件调用,它被大量使用。在bld_copy.py中执行线程复制的函数如下:

def copyFilesThread(fullFileList):
  # fullFileList contains a list of files to copy [(fileFromA, fileToA), (fileFromB, fileToB), ...]

  copyFileQueue = Queue.Queue()  # Create a job queue so we can copy the files in parallel

  class copyFileThread(threading.Thread):
    # Inherit from threading and overload the __init__ method so we can pass in the queue object
    def __init__(self, queue):
      threading.Thread.__init__(self)
      self.queue = queue

    def run(self):
      while True:
        filesToCopy = self.queue.get()
        try:
          sourceFile = filesToCopy[0]
          destinationFile = filesToCopy[1]
          if sourceFile and destinationFile:
            if os.path.islink(sourceFile):
              if not os.path.islink(destinationFile):
                linkto = os.readlink(sourceFile)
                os.symlink(linkto, destinationFile)
            else:
              try:
                shutil.copy(sourceFile, destinationFile)
              except shutil.Error as e:
                print('Error: shutil.copy: %s' % e)
              except IOError as e:
                print('Error: shutil IOError: %s' % e.strerror)
        except Exception as e:
          print '        %s' %(e)
        self.queue.task_done()

  # Start twenty threads and pass them the queue instance
  for x in xrange (20):
    t = copyFileThread(copyFileQueue)
    t.setDaemon(True)
    t.start()

  # Populate the queue and thread pool and load it up by looping over the fullFileList list
  for filesToCopy in fullFileList:
    copyFileQueue.put(filesToCopy)

  # wait on the queue until everything has been processed
  copyFileQueue.join()

我的问题是这个例程最终被调用了60次。我在Linux上注意到,如果我使用ps -fLu,每次我的外部循环完成时,我有额外的120个线程。当将此乘以10个外循环时,我可能有多达1200个线程,因此常规炸弹的原因是:

can't start new thread

考虑到这个设置的方式,有没有办法让我重新使用线程或让它们超出范围......(这是我假设会发生的事情)。我不是这方面的专家,非常感谢你的帮助。

0 个答案:

没有答案