新しいファイルのディレクトリを監視するために選択/世論調査/ kqueueの/のkeventを使用して

StackOverflow https://stackoverflow.com/questions/1165571

質問

私のアプリでは、私は、新しいファイル用のディレクトリを監視する必要があります。トラフィックの量が非常に大きく、登場毎秒新しいファイルの何百もの最小値があるように行っています。現在、私はアイデアのこの種のビジーループを使用しています:

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
読んでより多くの情報があるように

なぜ世論調査()機能していますか?私は何かがディレクトリに変わっていた場合、それが唯一のことを行うだろうと仮定します。

私はここでも可能に何をしようとしているか?

でない場合は、while True: look for changesする他のより良い代替手段がありますか?

役に立ちましたか?

解決

  

プロファイリングを実行した後、私は睡眠に費やした多くの時間を見ている、と私は代わりにポーリングを使用するために、これを変更する必要がある場合、私は思ったんだけど。

定期的に状態をチェックして、あなたすでにの行うの同期ポーリングのように見えます。 sleepに「費やした」時間を心配しないでください、それはCPU時間を食べることはありません。それはちょうど、要求のタイムアウト後にそのプロセスをウェイクアップし、オペレーティングシステムに制御を渡します。

あなたは、オペレーティング・システムが提供する変更通知をファイルシステムにリッスンライブラリを使用して非同期イベントループを考えるが、それは、この特定の状況であなたに真のメリットを与える場合は、最初の検討することもできます。

他のヒント

FreeBSDと従ってマックOS Xはinotifyを呼び出さたkqueueのアナログを提供します。詳細についてはFreeBSDマシン上で男2 kqueueのを入力します。 FreeBSDでkqueueのために、あなたは http://people.freebsd.org/~dwhite/で利用可能PyKQueueを持っていますあなたの走行距離は異なる場合がありようPyKQueue / には、残念ながら積極的に維持されていません。

なぜ<のhref =「http://www.gnome.org/~veillard/gamin/python.html」のrel =「nofollowをnoreferrer」のように、監視ファイルの変更のためのライブラリのいずれかのPythonラッパーを使用しません> gaminののかはinotify(pyinotifyを探し、私は...新しいユーザーとして1つのハイパーリンクを投稿することができています) - それは速くなるはずだと、低レベルのものは、すでにあなたのためのCレベルで行われています、カーネル・インタフェースを使用して...

あなたは select.kqueue のを見てしたい場合があります - 私はそれを使用していませんでしたが、私はあなたがファイル/ディレクトリを監視することができ、バックと呼ばれるそう信じBSDの下で、このための右のインターフェイスは、kqueueのあるときにのみ、彼らが変更されたときに、

私は図書館とあなたのためにこれを処理するシェルツールを書いてます。

http://github.com/gorakhargosh/watchdogする

がは、kqueueのディレクトリを監視するための非常にヘビー級の方法です あなたがどんなパフォーマンスをテストしてチェックアウトすることができれば、私は感謝します あなたが遭遇する可能性のある問題。パッチも歓迎されています。

HTHます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top