【发布时间】:2018-04-30 11:04:55
【问题描述】:
我创建了自己的线程类,将在线程池中使用如下:
class SendFilesThread(threading.Thread):
execute = True
def __init__(self, port, rate, fileQueue):
self.daemon = True
self.fileQueue = fileQueue
#Other initialization
def run(self):
while SendFilesThread.execute == True or not self.fileQueue.empty():
self.filename = self.fileQueue.get()
#some file processing
self.fileQueue.task_done()
@staticmethod
def terminate():
SendFilesThread.execute = False
在程序的主线程中,处理完所有文件后,我尝试关闭线程池,如下所示:
SendFilesThread.terminate()
for t in threadPool:
if t.is_alive():
t.join()
exit()
我的理解是,如果我调用join(),它将阻塞调用线程,在这种情况下是主线程,直到加入的线程完成处理。我的问题是,尽管线程完成了,但它永远不会返回到主线程并且程序只是挂起。关闭线程池时我做错了什么吗?
【问题讨论】:
-
由于你设置了
self.daemon = True,当主线程退出时线程会自动终止——所以你不需要join()s。但是,在SendFilesThread.__init__()中,您忘记使用Thread.__init__())(或更好的super().__init__())初始化基类,然后再按照documentation 所说的那样做。 -
实际上,我确实这样做了。可以假设
#Other initialization包括正确初始化线程的所有其他必要步骤。__init__方法中还有许多其他行,我认为这些行只会使问题陷入不必要的代码行。我知道,当主线程终止时,制作treads 守护程序将强制它们终止,这就是我首先将它们制作为守护程序的原因。我的问题是,在所有文件都发送到我的fileQueue之后,线程需要在主线程关闭之前有时间完成。
标签: python multithreading