2012-02-19 8 views
3

私はPythonアプリケーションを実行し、指定された間隔に基づいてアクションを実行しようとしています。以下のコードは常に100%のCPUを消費しています。pythonのプロセスがCPUを100%使用する

def action_print(): 

    print "hello there" 

interval = 5 
next_run = 0 

while True: 

    while next_run > time.time(): 
     pass 

    next_run = time.time() + interval 

    action_print() 

さまざまな間隔で実行するアクションが増えるため、プロセスをスリープ状態にしないようにしたいと考えています。

import time 
interval = 5 
next_run = 0 
while True: 
    time.sleep(max(0, next_run - time.time())) 

    next_run = time.time() + interval 
    action_print() 

あなたは他のスレッドがあなたを中断できるようにしたい場合は、eventは次のように使用します。

次の実行が可能になるとき、あなたが知っている場合、あなたは、単にtime.sleepを使用することができます

+2

一方的にスリープ状態にしたくない場合は、CPUを焼きます。 – Mat

+0

「さまざまな間隔で実行するアクションが増えるでしょう」について詳しく説明できますか? –

+0

プロセスがスリープしている間にすべてがオンタイムで実行されるようにするにはどうすればよいですか?私は睡眠を使用しようとしたが、秒未満のものはCPUを食べる。 – m1k3y3

答えて

12

をアドバイスしてください:

import time,threading 
interval = 5 
next_run = 0 
interruptEvent = threading.Event() 
while True: 
    interruptEvent.wait(max(0, next_run - time.time())) 
    interruptEvent.clear() 

    next_run = time.time() + interval 
    action_print() 

別のスレッドが今あなたを目覚めさせるinterruptEvent.set()を呼び出すことができます。

多くの場合、Lockを使用して共有データのrace conditionsを回避することもできます。ロックを保持している間は必ずイベントをクリアしてください。

cpythonでは、1つのスレッドだけがPythonコードを実行できることにも注意してください。したがって、あなたのプログラムが複数のスレッドにCPUバインドされていて、cpythonまたはpypyを使用している場合は、threadingmultiprocessingに置き換える必要があります。

+0

ありがとう、それは私が正確に探していたものです – m1k3y3

2

おそらくtime.sleep(interval)を書きたくないかもしれませんが、 'pass'をtime.sleep(0.1)に置き換えるとCPUがほぼ完全に解放され、WHILE述語に柔軟性が与えられます。

また、スケジュールしているイベントごとにスレッドを使用して、time.sleep(interval)を使用することもできますが、それでもCPUは拘束されます。

ボトムライン:あなたのループWHILE:PASSは、すべてのCPUを消費し、非常に高速になります。

+0

Trueを実行しているOSXボックスのプロセス:time.sleep (0.1)は0.0%のCPU使用率として最上位に表示されます。 – user1202733

関連する問題