PythonのタスクスケジューリングモジュールAPScheduler

A、APScheduler何&APScheduler 4種類のパーツ?

高度なPythonのスケジューラのためのプロセス全体APScheduler、Pythonは軽量タスクスケジューリングフレームワークです。これは、定期的にcronのように実行スケジュールタスクにあなたを可能にし、任意のPythonの関数や呼び出し可能オブジェクトをサポートしています。

1、スケジューラ(スケジューラ)

スケジューラ(スケジューラ)は、他の部分です。あなたは一般的にのみディスパッチャを使用して、アプリケーション開発者は通常、直接ジョブ保存、スケジューラとトリガに対処していない、逆に、スケジューラは、これらのインタフェースの適切な治療を提供します。設定は保存され、このような追加、変更、および削除の操作として、スケジューラに仕事で実行してもよいです。 

別のシナリオでは、スケジューラを選択できません。

  • BlockingScheduler:ディスパッチャは、実行したいときに使用する唯一のものです。
  • == BackgroundScheduler ==:あなたはあなたのアプリケーションの実行の背景に任意の他のフレームワークやスケジューラの用途(使用)を実行する必要はありません。
  • AsyncIOScheduler:使用しているとき、あなたのプログラムの用途は、(非同期フレーム)asyncio。
  • GeventScheduler:あなたのプログラムがgeventを使用しています(高性能同時Pythonのフレームワーク)を使用。
  • TornadoScheduler:使用しているとき、あなたのプログラムがトルネード(Webフレームワーク)に基づきます。
  • TwistedScheduler:使用しているとき、あなたのプログラムがツイスト(非同期フレーム)を使用しています
  • QtScheduler:アプリケーションがQtアプリケーションであれば、時間を使用することができます。
# BackgroundScheduler: 调度器在后台线程中运行,不会阻塞当前线程。


from apscheduler.schedulers.background import BackgroundScheduler
import time

scheduler = BackgroundScheduler()
 
def job1():
    print "%s: 执行任务"  % time.asctime()

scheduler.add_job(job1, 'interval', seconds=3)
scheduler.start()

while True:
    pass

2、保存ジョブ(ジョブストア)

仕事(ジョブストア)を格納することは、主にスケジュールされたジョブを格納するために使用され、仕事保存するデフォルトの動作は、単にメモリに格納されます。

jobstoreスケジューラは以下の点、のストレージに応じて、ジョブを変更して再検索インタフェースにおける欠失を提供します。

  • MemoryJobStore:いいえシリアライズ、ジョブがメモリ、CRUD操作はメモリにもあります
  • SQLAlchemyJobStore:すべてのSQLAlchemyのサポートデータベースをバックエンドとして使用することができ、CRUD操作は、対応するバックエンドのSQL文に変換しました
  • MongoDBJobStore:用のMongoDB作のバックエンド
  • RedisJobStore:Redisのとバックエンドとして
  • RethinkDBJobStore:用rethinkdb作のバックエンド
  • ZooKeeperJobStore:用のZooKeeper做バックエンド

図3に示すように、アクチュエータ(執行)

主タスク呼び出し可能(関数)のタイミングに、アクチュエータ(実行プログラム)を実行するメイン処理タスクを実行するプロセスまたはスレッドに提出。タスクが完了すると、アクチュエータは、スケジューラに通知します。

2つの方法で最も一般的なアクチュエータ(エグゼ):

  • ProcessPoolExecutor(プロセス・プール)
  • ThreadPoolExecutor(スレッドプール、最大:10)

図4に示すように、トリガ(トリガ)

タスクをスケジュールするとき、あなたはそれのためのトリガー(トリガー)を設定する必要があります。トリガーは、どのようなこのタスクの実行タイミングの形の、どのような日付/時刻を決めます。

APScheduler内蔵のトリガー3があります。

  • 日付:時間内に明確なポイントを指定し、ジョブは一度だけ行きました。
  • インターバル:指定した時間間隔(一定間隔)が定期的に実施しました。
  • クーロン:定期的に定期的に実行するジョブの(指定した時間内に)シーンのためのcron式を使用して行います。Linuxでのcrontabと同じ方法を使用してください。

4.1、日付定期的(一度だけ仕事)

パラメータは次のとおりです。

  • run_date(日時| STR) - 日付や時刻を実行するジョブ
  • timezone (datetime.tzinfo|str) – 指定时区
<!--# 2016-12-12运行一次job_function-->
sched.add_job(job_function, 'date', run_date=date(2016, 12, 12), args=['text'])

<!--# 2016-12-12 12:00:00运行一次job_function-->
<!--args=[]中是传给job_function的参数-->
sched.add_job(job_function, 'date', run_date=datetime(2016, 12, 12, 12, 0, 0), args=['text'])

4.2、インターバル:しばらく一度のを実行します

週間= 0 | 日= 0 | 時間= 0 | 分= 0 | 秒= 0、start_dateの=なし、END_DATE =なし、タイムゾーン=なし

  • 週(INT) - 週間間隔
  • 日(INT) - 間隔日
  • 時間(INT) - インターバル時間
  • 分(INT) - インターバル分
  • 秒(INT) - 間隔の秒数
  • START_DATE(日時| STR) - 開始日
  • END_DATE(日時| STR) - 終了日
  • タイムゾーン(datetime.tzinfo | STR) - 时区
<!--每隔2小时执行一次-->
scheduler.add_job(my_job, 'interval', hours=2)


<!--设置时间范围,在设置的时间范围内每隔2小时执行一次-->
scheduler.add_job(my_job, 'interval', hours=2, start_date='2017-9-8 21:30:00', end_date='2018-06-15 21:30:00)


<!--使用装饰器的方式添加定时任务-->
@scheduler.scheduled_job('interval', id='my_job_id', hours=2)
def my_job():
    print("Hello World")

Linuxで同じ方法を使用してのcrontab:4.3、クーロン

(二年=なし、月=なし、日=なし、週=なし、DAY_OF_WEEK =なし、時間=なし、分=なし、=なし、start_dateの=なし、END_DATE =なし、タイムゾーン=なし)

週とDAY_OF_WEEKに加えて、そのデフォルト値は*です

  • に等しい。例えば、日= 1、分= 20、
year='*', month='*', day=1, week='*', day_of_week='*', hour='*', minute=20, second=0

作業は、各月の最初の日に時間の毎時20分に実行されます

表現 パラメータタイプ 説明
* 全て ワイルドカード。例:毎分トリガーされる= *分
* / A 全て ワイルドカードは割り切れることができます。
AB 全て アブ・トリガー範囲
AB / C 全て それは割り切れるとき範囲AB、cはトリガすることができます
yのx番目 最初の数週間は、トリガ。xは、いくつかの最初で、yは曜日です
最後のx 月、最後の数週間は、トリガー
最終 トリガー月の最後の日
X、Y、Z 全て 式の組み合わせは、式以上の値を決定するために組み合わせることができます
  • 年(int型| STR) - 年、4桁の数字
  • 月(int型| STR) - 月(範囲1-12)
  • 日(int型| STR) - 日(範囲1-31)
  • 週(int型| STR) - 週(範囲1-53)
  • DAY_OF_WEEK(int型| STR) - 最初の数週間、数日または数週間(結婚範囲0-6か月、火曜、木曜、金曜、土、日)
  • 時間(int型| STR) - (範囲0-23)
  • 分(int型| STR) - 分(範囲0-59)
  • 第二(int型| STR) - 秒(範囲0-59)
  • START_DATE(日時| STR) - 最も早い開始日(付属)
  • END_DATE(日時| STR) - 最新の終了時刻(付属)
  • timezone (datetime.tzinfo|str) – 指定时区
sched.add_job(my_job, 'cron', hour=3, minute=30)
sched.add_job(my_job, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2017-10-30')

@sched.scheduled_job('cron', id='my_job_id', day='last sun')
def some_decorated_task():
    print("I am printed at 00:00:00 on the last Sunday of every month!")
    

使用方法APSched:どのように二、?

インストール

  • ピップインストール
pip install apscheduler
  • ソースのインストール(https://pypi.python.org/pypi/APScheduler/)
python setup.py install

クイックスタート

# first.py

from apscheduler.schedulers.blocking import BlockingScheduler
import time

# 实例化一个调度器
scheduler = BlockingScheduler()
 
def job1():
    print "%s: 执行任务"  % time.asctime()

# 添加任务并设置触发方式为3s一次
scheduler.add_job(job1, 'interval', seconds=3)

# 开始运行调度器
scheduler.start()
  • 出力を実行します。
> python first.py

Fri Sep  8 20:41:55 2017: 执行任务
Fri Sep  8 20:41:58 2017: 执行任务
...

タスクアクション

1、タスクを追加

方法の一つ:コールadd_job()メソッド

コールadd_job()メソッドは、apscheduler.job.Jobインスタンスが変更または削除ジョブに使用することができる返します

job = scheduler.add_job(myfunc, 'interval', minutes=2)

方法2:デコレータscheduled_job()

実行がジョブの実行中に変更されませんアプリケーションに適し

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
# 装饰器
@sched.scheduled_job('interval', id='my_job_id', seconds=5)
def job_function():
    print("Hello World")
# 开始
sched.start()

2、タスクを削除します

 <!--方法一:通过作业ID或别名调用remove_job()删除作业-->
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')


<!-- 方法二:通过add_job()返回的job实例调用remove()方法删除作业-->
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()

3、タスクを一時停止して続行

ジョブスケジューラインスタンスまたは自身で簡単に一時停止し、操作を再開します。ジョブが中断されると、次回はもはや、ジョブ回復するまで実行し、実行時間を計算するためにクリアされません。仕事を一時停止するには、次のいずれかを使用します。

<!--根据任务实例-->
job = scheduler.add_job(myfunc, 'interval', minutes=2)
<!--暂停-->
job.pause() 
<!--继续-->
job.resume() 


 <!--根据任务id暂停-->
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.pause_job('my_job_id')
scheduler.resume_job('my_job_id')

4、変更タスクのプロパティ

<!--修饰:-->
job.modify(max_instances=6, name='Alternate name')


<!--重设:-->
scheduler.reschedule_job('my_job_id', trigger='cron', minute='*/5')

5、ジョブリストへのアクセス

  • すべてのジョブ・インスタンスを取得するGET_JOBS()を使用します。
  • 使用print_jobsは()すべてのジョブの書式付きリストを出力します。
  • 使用get_job(タスクID)は、ジョブの指定されたタスクのリストを取得します。
<!--获取所有的job实例-->
apscheduler.get_jobs()

6、スタート&シャットダウンタスク


scheduler.start() #开启
scheduler.shotdown(wait=True|False) #关闭 False 无论任务是否执行,强制关闭

第三に、定期的なタスクのスクリプトの一部

1、午前0時30分30秒で毎日スクリプトの実行を実行するようにスケジュールされたタスク

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from app.untils.log_builder import sys_logging

scheduler = BlockingScheduler()   # 后台运行

 # 设置为每日凌晨00:30:30时执行一次调度程序
@scheduler.scheduled_job("cron", day_of_week='*', hour='1', minute='30', second='30')
def rebate():
        print "schedule execute"
        sys_logging.debug("statistic scheduler execute success" + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))


if __name__ == '__main__':
    try:
        scheduler.start()
        sys_logging.debug("statistic scheduler start success")
    except (KeyboardInterrupt, SystemExit):
        scheduler.shutdown()
        sys_logging.debug("statistic scheduler start-up fail")

2 0:00午後毎日 - 8:00の間に、5秒ごとに一度タスクを実行します。

# 每天晚上0点 - 早上8点期间,每5秒执行一次任务。
scheduler.add_job(my_job, 'cron',day_of_week='*',hour = '0-8',second = '*/5')

3、0,10,20,30,40,50共有でタスクを実行します。

<!--# 可以被10整除的时间点执行任务,这个任务就表示在0、10、20、30、40、50分时都会执行任务-->
scheduler.add_job(my_job, 'cron',day_of_week='*',minute = '*/10')

4、月曜から金曜午前5:30に2020年5月30日、週、両方の時限タスクを実行するまで、

<!--直到2020-05-30 00:00:00,每周星期从星期一到星期五的早上5:30都执行一次定时任务-->
sched.add_job(my_job(),'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2020-05-30')


<!--# 截止到2016-12-30 00:00:00,每周一到周五早上五点半运行job_function-->
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2016-12-31')

図5に示すように、タスク実行タイミング6、7、8、11、12月の第3金曜日の1,2,3点

<!--job_function将会在6,7,8,11,12月的第3个周五的1,2,3点运行-->

sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')

6、プログラムは、5秒ごとに一度実行されます

<!--#表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5-->
sched.add_job(my_job, 'cron',second = '*/5')

参考資料

  • PythonのタスクスケジューリングモジュールAPSchedulerます。https://segmentfault.com/a/1190000011084828
  • 公式文書ます。https://apscheduler.readthedocs.io/en/v3.3.0/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler.print_jobs
  • APIドキュメントします。https://apscheduler.readthedocs.io/en/v3.3.0/py-modindex.html
  • pythonモジュール(APSchedulerスケジュールされたタスク)します。https://blog.csdn.net/qq_37634812/article/details/79208782
  • Pythonの正規タスクAPScheduler詳細な例例:HTTPS://www.jb51.net/article/165895.htm

おすすめ

転載: www.cnblogs.com/jasontang369/p/12178774.html