我发现了其他与此相似的问题,但它们有些微妙的不同,我无法弄清楚如何回答我自己的问题......我知道我创造了太多线程我只是不知道如何阻止它!
我有一个例程,通过循环遍历每个构建来处理软件构建(假设构建的最大数量是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
考虑到这个设置的方式,有没有办法让我重新使用线程或让它们超出范围......(这是我假设会发生的事情)。我不是这方面的专家,非常感谢你的帮助。