2017-12-06 1 views
1

定期的なタスクをブロックせずにPythonでスケジュールする方法はありますか?Pythonで定期的なタスクをスケジュールする方法は?

ここは単純な状況です。このチケット変数が2時間後に無効になったとします。だから私はサーバーからそれを取得する必要がありますが、私はそれを単純に保っています。

ticket = 1 # It expires every 2 hours 

def process_using_ticket(): # This function is called using a get request from flask server 
    print('hello', ticket) 

2時間ごとにブロックせずに1にリセットするにはどうすればよいですか?

スレッドを開始して2時間スリープ状態にしてから変数をリセットすることもできますが、より良い選択肢があるかどうかは疑問です。

注:すべてはドッカーで実行されます。

+0

[PythonでCronのようなスケジューラを取得するにはどうすればいいですか?](https://stackoverflow.com/questions/373335/how-do-i-get-a-cron-like-scheduler-in- Python) – YSelf

答えて

3

これはcronのためのユースケース、定期的なタスクをスケジュールするために、すべてのLinuxマシン上で見つかった簡単なユーティリティのように見えます。エントリー

0 */2 * * * /home/username/ticket_script.py 

はスクリプトが実行権限を持っていることを確認してください行い、cronの内

$ crontab -e 

:シンプルクーロンタスクは次のように作成することができます。

を:> https://forums.docker.com/t/cronjobs-in-docker-container/2618/5言う - ケースでは、ドッカーでこれを実行する上での落とし穴について

0 */2 * * * /home/username/ticket_script.py >> /home/username/ticket_script_runs.log 

のように、あなたはこのスレッドを通過することができますが、その出力に含まをリダイレクトするために、スクリプトで何かを印刷するcronエントリを作成しています

ほとんどのDockerコンテナは、指定したバイナリ(この場合は/ bin/bash)のみを実行するため、これらのジョブを起動するcronデーモンはありません。

あなたはこの問題に対処することができますいくつかの方法があります - 小さなアドホックもののためには、あなたは...あなたのホストのcrontabにcronのエントリを追加し、ドッキングウィンドウのexec containernameを使用して、コンテナ内のジョブをトリガすることができます

コンテナのエントリポイントをcronを起動するシェルスクリプトで置き換えることができます。あるいは、いくつかのサービスが必要な場合は、supervisordのようなものを使用してそれらを管理することができます。

あなたがすべて入っているなら、docker execを使ってタスクをキックオフするために使用できるcronコンテナを作ることができます。


他のアプローチは、あなたがすでに持っているものである - 2時間スリープ状態に入る、またはtime_last_readタイムスタンプを維持し、場合評価のあった2あなたの最後の読み取り以降の時間(time_now - time_last_read >= 2_HOURS)、および再読み込みを保ちます条件がTrueになるとメモリに値がセットされ、time_last_readがリセットされます。

+0

ちょうどcronの代わりに単純なチェック時間の方法に行きました。 – utengr

+1

助けて幸せ@utengr。私はそれが大きく、この場合、ソリューションの選択に影響を与えているので、質問にドッカータグを追加しました。 –

1

time.sleep(7200000)の機能に入れてください。これと同じように:

import time 

ticket = 1 

def main_loop(): 
    while True: 
     time.sleep(7200000) 
     ticket = 1 

def process_using_ticket(): 
    print('hello', ticket) 
main_loop() 
関連する問題