2017-02-06 8 views
3

入力:プログラム開始からの相対的な浮動小数点値の配列(秒単位)。 [0.452,0.963,1.286,2.003、...]。それらは均等に離間していません。python:ビジーなループなしで異なる正確な時間にタスクを実行します。

所望の出力:出力これらの回でコンソールにテキスト(すなわち印刷「#」)

は、私の質問はこれについて移動するための最良の設計原理は何かということです。以下はtime.timeを使った私の素朴な解決法です。

times = [0.452, 0.963, 1.286, 2.003] 
start_time = time.time() 
for event_time in times: 
    while 1: 
     if time.time() - start_time >= event_time: 
      print '#' 
      break 

上記のビジーループを使用すると、直感的に間違っているように感じられます(独自のスレッド内であっても)。

私はスケジュールに傾いたが、より良い設計オプションがないことを確認したいんだ:Executing periodic actions in Python

タイマーオブジェクトもあります:timers

編集:イベントのみ必要10msの精度なので、+は/ - 正確なイベント時刻から10ms。

+0

質問には実際に1ミリ秒の精度が必要ですか? –

+0

いいえ - 約10ミリ秒にする必要があります(正確な時刻の前後10ミリ秒でイベントが発生する可能性があります)。 –

+2

[sched](https://docs.python.org/2/library/sched.html)モジュールをご覧ください。役立つかもしれません。 – khachik

答えて

0

ビジー待機よりも良いパターンは、time.sleep()を使用することです。これは、CPUを使用するのではなく、実行を中断します。

time_diffs = [0.452, 0.511, 0.323, 0.716] 
for diff in time_diffs: 
    time.sleep(diff) 
    print '#' 

スレッディングも同様の効果が得られます。しかし、これらの両方のソリューションは、プログラムの再起動のたびに実行したいアクションが無視できる時間(おそらく印刷には当てはまらない)である場合にのみ機能します。

10msの精度があり、標準OSでPythonを使用したい場合、パターンは機能しません。私はこの質問をReal time operating via Pythonにお勧めします。これは、GUIイベント(スクリーンへの印刷)は、そのレベルの精度では低速で信頼性が低く、Pythonが実行される典型的なOSは精度を保証せず、Pythonのガベージコレクション「リアルタイム」イベントが必要な場合は、メモリ管理も大混乱になります。

関連する問題