1

我有一个在旧笔记本电脑上运行的程序,它不断监视 Dropbox 文件夹中是否添加了新文件。当它运行时,Python 进程在双核机器上使用了接近 50% 的 CPU,在 8 核机器上使用了大约 12%,这表明它正在使用接近 100% 的一个核心)。这会散发出很多热量。

相关的代码是:

while True:
    files = dict ([(f, None) for f in os.listdir(path_to_watch)])
    if len(files) > 0:
        print "You have %s new file/s!" % len(files)
        time.sleep(20)

在没有新文件的情况下,当然大部分时间都应该花在time.sleep()等待上,我不会认为这会占用大量 CPU 资源——而这里的答案似乎说不应该这样。

所以两个问题:

1)既然time.sleep()不应该如此占用CPU,这里发生了什么?

2) 是否有另一种方法可以监视文件夹中运行更酷的更改?

4

2 回答 2

3

1)只有当有新文件时才会调用你的睡眠。

这应该会好很多:

while True:
    files = dict ([(f, None) for f in os.listdir(path_to_watch)])
    if len(files) > 0:
        print "You have %s new file/s!" % len(files)
    time.sleep(20)

2) 是的,尤其是在使用 linux 时。Gamin 将是我建议研究的东西。

例子:

import gamin
import time
mydir = /path/to/watch
def callback(path, event):
    global mydir
    try:
        if event == gamin.GAMCreated:
            print "New file detected: %s" % (path)
            fullname = mydir + "/" + path
            print "Goint to read",fullname
            data = open(fullname).read()
            print "Going to upload",fullname
            rez = upload_file(data,path)
            print "Response from uploading was",rez
    except Exception,e: #Not good practice
        print e
        import pdb
        pdb.set_trace()


mon = gamin.WatchMonitor()
mon.watch_directory(mydir, callback)
time.sleep(1)
while True:
    ret = mon.handle_one_event()
mon.stop_watch(mydir)
del mon
于 2013-08-01T13:25:29.713 回答
2

还有一个跨平台的 API 来监控文件系统的变化:Watchdog

于 2013-08-01T13:31:29.093 回答