私のアプリでは、ディレクトリで新しいファイルを監視する必要があります。トラフィックの量は非常に多く、1秒あたり最低数百の新しいファイルが表示されます。現在、私はこの種のアイデアでビジーループを使用しています:
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
プロファイリングを実行した後、睡眠中に多くの時間が費やされているのを見て、代わりにポーリングを使用するようにこれを変更する必要があるかどうか疑問に思っています。
で使用可能なクラスの1つを使用してディレクトリをポーリングしようとしていますselect
が、それが実際に機能するのか、それとも間違っているだけなのかわかりません。
次のコマンドでディレクトリのfdを取得します。
fd = os.open('.', os.O_DIRECT)
次に、ディレクトリがいつ変更されるかを確認するために、いくつかの方法を試しました。例として、私が試したことの1つは次のとおりです。
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
ますか?