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

时间:2016-01-01 16:14:44

标签: python windows

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

现在这是真正的问题: 我编写的代码正在工作,并在检测到更改时通知用户。但是当我尝试使用 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)

1 个答案:

答案 0 :(得分:1)

我通过设置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')