2017-10-24 4 views
1

私はスケジューリング機能と将来のイベントのキューが時間順に並べられたスケジューラを持っています。 UNIXタイムスタンプと通常のtime.time()を使用しています。スケジューラの一つの断片はこれにほぼ同等である:単調な時間の正確な時間のスケジューリング

eventtimeがいずれかの計算遅延に基づくことができる
# select the nearest event (eventfunc at eventime) 
sleeptime = eventtime - time.time() 
# if the sleep gets interrupted, 
# the whole block will be restarted 
interruptible_sleep(sleeptime) 
eventfunc() 

eventtime = time.time() + delay_seconds 

又は正確な日付と時刻に基づいて、例えば:

eventtime = datetime(year,month,day,hour,min).timestamp() 

ここでは、単調な時間をPythonで使用しています。私は単調な時間を使用するようにスケジューラを変更することを検討しています。スケジューラは、彼らが言う単調な時間を使用することになっています。

遅延で問題ありません:

sleeptime = eventtime - time.monotonic() 

eventtime = time.monotonic() + delay_seconds 

しかし、私は最善の方法は、それがあるようなコードを残すことだと思う正確な時間を持ちます。あれは正しいですか?

「はい」の場合は、単調な時間に基づくイベント・キューと通常の時間に基づくイベント・キューの2つが必要です。私はその考えがあまり好きではありません。

+0

['sched'標準モジュール](https://docs.python.org/3/library/sched.html)をご覧ください。これは時間操作のバックエンドとは独立して設計されており、デフォルトで 'time.monotonic'を使用します。 –

答えて

1

私がコメントで述べたように、あなたのコードはsched standard moduleの機能を複製しています。この問題を解決して、それをマイグレーションする便利な言い分として使うこともできます。言っ

システム時刻が前方または後方ジャンプは、タスク固有のものであるならば、あなたが行うことになっているもの
  • 。あなたが何かにかかわらず、それらの間で設定した間隔で物事を行う必要がある場合
  • time.monotonic()
  • だから、あなたのソリューションではなく、時間に反応することが予想される場合にはジャンプしそう遅かれ早かれ、それよりもスケジュールされたタスクを実行して、例のために設計されています新しいシステム時間に応じて、単調な時間を使用する理由はありません。

あなたは両方を行いたい場合、あなたはどちらか2つのスケジューラ、または2種類のタイムスタンプを持つタスクを必要とします。

後者の場合、スケジューラは1つのタイプを他のタイプに変換する必要があります(次のタスクを実行するかどうかを計算するたびに)。timeでは意味がありません。

+0

私のプログラムでは、NTPがうまく構成されていることを前提としています。すなわち、サーバーはジャンプのない正確な時刻を持っています。しかし、それだけでは、より堅牢なソリューションを持つことは常に良いことです。だから私は単調時計の賛否両論を調べている。あなたは私の質問に直接答えなかった。スケジューラでの単調なクロックを利用するために必要な2つのイベント・キューはありますか?一つのキュー - 遅延、間隔などのために - 'time.monotonic'と別のキューでの作業 - 正確な日付/時刻にスケジュールするために - ' time.time'での作業? – VPfB

+0

更新を参照してください。 –

関連する問題