为什么我的multithreading应用程序的主线程对Ctrl + C没有响应?

我写了一个multithreading应用程序来观察和响应给定文件列表中的变化。 我有一个Watch类获取文件大小,并将其设置为第一次调用时的sizevariables。 然后,在几秒钟后,它再次得到文件的大小,并与前一个大小进行比较,如果更改,将size设置为文件的当前大小。 此外还有一个WatchWorker类,它是threading.Thread的子类。 使用Watch类来监视给定文件的WatchWorker

现在这是真正的问题:我写的代码正在工作,并在检测到更改时通知用户。 但是当我尝试使用Ctrl + C退出应用程序时没有任何反应。 我在Windows上。

码:

 import time import threading import os class Watch(object): def __init__(self, path, time=5): self.path = path self.time = time self.size = os.stat(path).st_size def loop(self): while True: time.sleep(self.time) size = os.stat(self.path).st_size if size != self.size: self.size = size print "Change detected in file {}".format(self.path) class Watch_Worker(threading.Thread): def __init__(self, path, *args, **kwargs): super(Watch_Worker, self).__init__(*args, **kwargs) self.path = path def run(self): super(Watch_Worker, self).run() Watch(self.path).loop() def main(*args): for i in args: thrd = Watch_Worker(path=i) thrd.start() print 'Watching ' + i print "From main thread" if __name__ == '__main__': main('blah.js', 'cs.c', 'ab.rb') 

编辑

修改代码来比较产生的值os.stat('somefile.ext').st_size)

我通过设置self.daemon = True解决了主线程被阻止退出的问题。 主线程不会等待线程退出。 这是通过添加一个无限的while循环time.sleep(5)main函数结束来解决的。 这里是代码:

 class Watch_Worker(threading.Thread): def __init__(self, path, time=2, *args, **kwargs): super(Watch_Worker, self).__init__(*args, **kwargs) self.path = path self.time = time self.size = os.stat(path).st_size self.daemon = True def run(self): super(Watch_Worker, self).run() while True: time.sleep(self.time) size = os.stat(self.path).st_size if size != self.size: self.size = size print "Change detected in file {}".format(self.path) def main(*args): for i in args: thrd = Watch_Worker(path=i) thrd.start() print 'Watching ' + i while True: time.sleep(5) if __name__ == '__main__': main('blah.js', 'cs.c', 'ab.rb')