在我的应用程序中,我需要观察新文件的目录。流量非常大,每秒会出现至少数百个新文件。目前我使用一个繁忙的循环有这种想法:使用select/poll/kqueue/kevent观看新文件的目录
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
运行分析,我看到了很多在睡眠中度过的时间后,我想知道我是否应该改变这种使用轮询代替。
我想用select
中的一个可用类来轮询我的目录,但我不确定它是否真的有效,或者我只是做错了。
我得到一个FD我的目录中:
fd = os.open('.', os.O_DIRECT)
然后我试过几种方法时,看到目录的变化。举个例子,我试过的一件事是:
poll = select.poll()
poll.register(fd, select.POLLIN)
poll.poll() # returns (fd, 1) meaning 'ready to read'
os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least
poll.poll() # returns (fd, 1) again
os.read(fd, 4096) # empty string - no more data
为什么poll()的行为就像有更多的信息要读?我认为只有在目录中的内容发生变化时才会这样做。
我试图在这里甚至有可能做什么?
如果没有,是否有任何其他更好的替代while True: look for changes
?
我使用BSD所以inotify不可用,它看起来像gamin不是。 – gdm 2009-07-24 18:12:54
gamin文档说它可以在FreeBSD上使用,但是使用的是不太理想的轮询解决方案 - 它可能仍然比其他任何东西都快,尽管 – 2009-07-25 08:16:47