在我的应用程序中,我需要查看新文件的目录。流量非常大,每秒至少会出现数百个新文件。目前,我正在使用带有这种想法的繁忙循环:
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
吗?