作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我编写了一个多线程应用程序来监视和响应给定文件列表中的更改。我有一个 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)
。
最佳答案
我通过设置self.daemon = True
解决了主线程被阻止退出的问题。主线程不等待线程退出。这是通过在 main
函数的末尾添加一个带有 time.sleep(5)
的无限 while
循环来解决的。这是代码:
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')
关于python - 为什么我的多线程应用程序的主线程对 Ctrl+C 没有响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557738/
我是一名优秀的程序员,十分优秀!