在我的应用程序中,我需要查看目录中的新文件。流量非常大,每秒将至少出现数百个新文件。目前,我正在使用这种想法的繁忙循环:

while True:
  time.sleep(0.2)
  if len(os.listdir('.')) > 0:
    # do stuff

运行分析后,我发现 sleep 中花费了大量时间,并且我想知道是否应该更改它以使用轮询。

我试图使用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

最佳答案



看起来您已经通过定期检查状态来进行同步轮询。不用担心sleep中“花费”的时间,它不会占用CPU时间。它只是将控制权传递给操作系统,该操作系统在请求的超时后唤醒进程。

您可以考虑使用一个监听操作系统提供的文件系统更改通知的库的异步事件循环,但是首先考虑在这种特殊情况下它是否给您带来了真正的好处。

关于python - 使用select/poll/kqueue/kevent查看目录中的新文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1165571/

10-11 23:19
查看更多