2017-02-22 5 views
-1

12,12:30,1,1:30に実行されるcronジョブがあります。だから時計の半時間間隔ごとに。私はcronジョブが実行されるたびに私のPythonコードでスレッドを実行したい。Pythonのcronジョブと同期するクロック時間のスレッドタイマーを設定できますか?

私は30分ごとにタイマーを設定した場合、例えばx15秒ごとにタイマーを設定すると、x15秒ごとにタイマーを実行する例を見たことがあります。 1:45 pm。私は午後1時30分に実行するスレッドにしたい。それは可能ですか?

答えて

0

ほとんどすべてが可能ですが、本当の疑問はなぜこれをしたいのですか? cronスケジューラは必ずしも正確な時刻にジョブを実行する必要はなく、さらにPythonの時刻をチェックすることはcronの時刻に必ずしも対応しないため、の後にPythonコードで何かを実行する必要がある場合cronジョブはあなたは実際にあなたのcronジョブからあなたのPythonスクリプト(データグラムソケットを使うのが最も簡単でしょう)と '通信'する必要があります。

しかし、あなたはPythonでcronスケジューラーをシミュレートしたいこれを行う方法の1つは、datetimeモジュールを使用して現在の時刻を取得し、コマンドが再起動する前に必要な数量を計算することです。

def schedule_hourly_task(task, minute=0): 
    # get hourly offset in seconds in range 1-3600 
    period = ((60 + minute) % 60) * 60 or 3600 
    while True: 
     # get current time 
     current = datetime.datetime.now() 
     # count number of seconds in the current hour 
     offset = (current - current.replace(minute=0, second=0, microsecond=0)).total_seconds() 
     # calculate number of seconds til next period 
     sleep = period - offset % period 
     if offset + sleep > 3600: # ensure sleep times apply to full hours only 
      sleep += 3600 % period 
     # sleep until the next period 
     time.sleep(sleep) 
     # run the task, break the loop and exit the scheduler if `False` is returned 
     if not task(): 
      return 

次に、それを使用して任意のタスクを任意のfull_hour + minuteオフセットで実行することができます。たとえば、次のように

counter = 0 
def your_task(): 
    global counter 
    counter += 1 
    if counter > 2: 
     return False 
    return True 

schedule_hourly_task(your_task, 15) 

そして、それはyour_task()戻りFalseまで15分ごとにyour_task()機能を実行します - 終了する前にhh:15hh:30hh:45で、この場合にはあなたのケースでは、schedule_hourly_task(your_task, 30)に電話すると、your_task()が30分ごとにyour_task()関数を呼び出し、Trueを返します。

関連する問題