在我的應用程序中,我需要觀察新文件的目錄。流量非常大,每秒會出現至少數百個新文件。目前我使用一個繁忙的循環有這種想法:使用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