5

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

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()

さまざまな間隔で実行するアクションが増えるため、プロセスをスリープ状態にすることは避けたいと思います。

お知らせ下さい

4

2 に答える 2

14

次の実行がいつになるかがわかっている場合は、次のように簡単に使用できますtime.sleep

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

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

他のスレッドが割り込みできるようにしたい場合は、次のようなイベントを使用します。

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()て、自分のスレッドをウェイクアップできるようになりました。

多くの場合、共有データの競合状態を回避するためにロックも使用する必要があります。ロックを保持している間に必ずイベントをクリアしてください。

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

于 2012-02-19T13:35:56.947 に答える
2

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

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

結論 : あなたのループ WHILE : PASS は、すべての CPU を非常に高速に消費します。

于 2012-02-19T13:39:46.483 に答える