2011-01-14 5 views
2

可能性の重複:
tail -f in python with no time.sleep私は投票する必要がないので、私はpythonでreadline()をブロックできますか?

私は(tail -fのような)に書き込まれているログファイルを監視しようとしている、と私が作る方法を見つけ出すことはできませんreadline()ブロックはeofに達するとブロックします。私のグーグルのすべてが、物事をNONブロッキングにするための解決策しか提示していませんでした。誰もがこのブロックのような呼び出しを行う方法を知っているので、私は投票する必要はありませんか? (あなたは私があなたを評価するつもりだことを示唆しているので、もし私が、すでにポーリングと睡眠の完全に可能です。)

fh = open('logfile') 
# I only want new output, so seek to the end of the file 
fh.seek(-1,2) 
while True: 
    # I want this to block until the file has new output, 
    # but it sees eof and returns '' immediately 
    line = fh.readline() 
    # ... process the line 
+3

あなたは 'tail -f'が投票するのを知っていますか? –

+0

Pythonで[tail-sleep in time.sleep](http://stackoverflow.com/questions/1475950/tail-f-in-python-with-no-time-sleep)の明確な複製ですが、態度があります。 ..閉会投票... – dawg

+0

もしあなたがLinuxであれば、pyinotify http://pyinotify.sourceforge.net/をチェックアウトすることができます。私は技術的にはそれも投票すると思うが、それはカーネルの助けを借りて行う。 – Falmarri

答えて

0

あなたができない、本当に「ポーリングなしブロック」。あなたがを持っていれば、ある時点でファイルに新しいデータがあるかどうかを確認できます。絶え間なく更新されているプロセスを記述するときは、ISR(割り込みサービスルーチン)をアセンブリに記述していない限り、最終的にポーリングする必要があります。それでも、CPUは常に保留中の割り込みをポーリングしています。

ファイルに1秒ごとに新しいデータがあるかどうかをチェックするコードは次のとおりです。これにより、CPU使用率が最小限に抑えられます。

fh = open('logfile') 
# I only want new output, so seek to the end of the file 
fh.seek(-1,2) 
# 'while True' is sort of bad style unless you have a VERY good reason. 
# Use a variable. This way you can exit nicely from the loop 
done = False 
while not done: 
    # I want this to block until the file has new output, 
    # but it sees eof and returns '' immediately 
    line = fh.readline() 
    if not line: 
     time.sleep(1) 
     continue 
    # ... process the line 
     #... if ready to exit: 
      done = True 
+1

あなたは確実にポーリングすることなくブロックすることができます。シリアルデバイスまたはパイプからの読み取りには通常、読み取りをブロックする必要があります。たとえば、Cの基本I/O呼び出しは通常ブロックします。しかし、 'open'によって返されるpythonのファイルオブジェクトはそうではありません。 – dronus