概要
プログラム(関数)を,指定した時刻(HH:MM:SS)を起点に,指定した時間(HH:MM:SS)のインターバルで,指定した回数だけ実行する.
引数
- 実行時刻の文字列(HH:MM:SS表記,str型)
- インターバル時間の文字列(HH:MM:SS表記,str型)
- 実行回数(int型)
- 関数(引数なし,つまり,def FunctionName()の形式)
戻り値
なし
コード
import datetime import time #201203:プログラム(関数)を,指定した時刻に実行する.ただし,関数は引数なしのものに限る #…これは,プログラムの処理開始~完了までにかかる時間の分,スリープ時間を引くのでインターバルが伸びない.schedule関数,要らなかったorz def ProcessTimerEvery(HHMMSS_Sta,HHMMSS_Every,N_Max,TestJob):#引数は実行開始時刻,刻み時間,繰り返し回数,実行したい関数(引数なしのものに限る) time_Sta = datetime.datetime.strptime(HHMMSS_Sta, "%H:%M:%S") time_Now=datetime.datetime.now() time_Every = datetime.datetime.strptime(HHMMSS_Every, "%H:%M:%S") #print('time_Every=',time_Every) time_Every =int(time_Every.second)+60*int(time_Every.minute)+3600*int(time_Every.hour) #プログラム実行のインターバルを秒換算.遅延分(ざっくり0.2sec)をひいとく #print('time_Every=', time_Every) #print('time_Sta=',time_Sta,'time_Now=',time_Now) delta_time=time_Sta-time_Now delta_time=int(delta_time.seconds) print('プログラム待機中.本プログラムが呼び出されてから',delta_time,'秒後に実行するよ') time.sleep(delta_time) print('プログラム実行!') for i in range(N_Max): TimeProgSta=datetime.datetime.now() TestJob() TimeProgEnd = datetime.datetime.now() IntProg=TimeProgEnd-TimeProgSta IntProg=int(IntProg.seconds) #呼び出したプログラムの処理にかかった時間(秒)を計算 if time_Every-IntProg<0: time_Sleep=0 else: time_Sleep =time_Every-IntProg time.sleep(time_Sleep)#スリープ時間を,プログラムの処理にかかった時間分,短くする
タスクスケジューラ(またはcron)でpythonを呼び出したとき,自動売買のためのメイン関数(引数なし)を所望の時刻に起動するための関数が欲しくて作成した.
基本的には,pythonコードを呼び出した時刻と,メイン関数を実行するまでの時刻のインターバル時間分だけ待機する,という考え方で書いている.
1回目を実行したら,実行開始~終了までにかかる時間の分だけ,2回目実行までのインターバルを短縮することで,そこそこ正確な時刻で2回目を実行するようにしている.…そもそも最初はschedule関数で書こうとしていたけど,どうにも使い勝手が悪かった…
コメント