ProcessTimerEvery

概要

プログラム(関数)を,指定した時刻(HH:MM:SS)を起点に,指定した時間(HH:MM:SS)のインターバルで,指定した回数だけ実行する.

引数

  1. 実行時刻の文字列(HH:MM:SS表記,str型)
  2. インターバル時間の文字列(HH:MM:SS表記,str型)
  3. 実行回数(int型)
  4. 関数(引数なし,つまり,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関数で書こうとしていたけど,どうにも使い勝手が悪かった…

コメント

タイトルとURLをコピーしました