2009-08-19 5 views
2

これはPythonで書かれたtail -fの簡単な実装です。これの問題はループの性質にあり、このスクリプトはCPU時間を大幅に増やすことが好きです。フォークされたプロセス/デーモンとして実行したいものなら、非効率的なスタートになります。100%CPUを使用しないtail -f pythonスクリプトを書く

CPUの効率的なtail -fをPythonで記述するにはどうすればよいですか?

# CPU inefficient tail -f 
    def main(): 
    filename = '/tmp/foo' 
    file = open(filename, 'r') 
    st_results = os.stat(filename) 
    st_size = st_results[6] 
    file.seek(st_size) 
    lastmatch = 0 

    while 1: 
     where = file.tell() 
     line = file.readline() 
     if not line: 
     time.sleep(1) 
     file.seek(where) 
     else: 
     print line, 
+0

本当に、スリープ(1)であっても、CPUを大量に消費していますか?そのファイルは継続的に書かれていますか?考慮したいことがあるかもしれませんが、大部分のCPUをプロセスが使用するのは大丈夫です。特に、他のプロセスがそれを必要としない場合は特にそうです。それ以外の場合は、無駄です(ただし、ポータブルデバイスのバッテリ寿命は例外です)。 – paxdiablo

答えて

0

一方の側のWindowsともう一方のシステムの間には、非常に効率的で移植性の高い実装についてはわかりません。ちょうどどこでも、標準ライブラリのselectモジュール(select、kqueueなどのシステムレベルの機能に基づいています)を使用して、ポーリングを行わずにファイルに変更があったときにのみ起動できます。 Windowsではselectはソケットでしか動作しません。したがって、Windowsでは、代わりにディレクトリ変更通知を使用します(たとえば、ctypesまたはwin32を使用)。