apscheduler -定時任務


https://apscheduler.readthedocs.io/en/latest/userguide.html

簡單的使用方式為:

 

from apscheduler.schedulers.blocking import BlockingScheduler

 

sched = BlockingScheduler()

sched.add_job(ff_task,'cron',hour='0-1,8-23',minute=28)
sched.add_job(avor_task, 'cron', hour='2-7', minute='0')
sched.add_job(vor_task,'cron',hour='0-1,8-23',minute='*/3')
try:
    sched.start()
except (KeyboardInterrupt, SystemExit):
    sched.shutdown()

 

 

 

apscheduler包含四個組件 :triggers觸發器 , schedulers 調度器 ,job stores任務存儲 , executors執行器 

triggers 包含計划的邏輯,每個任務都有自己的觸發器,來決定任務下次被觸發的時間,除了類型的初始配置,觸發器是完全無狀態的

job stores 用戶存儲被計划的任務,默認存儲在內存中,也可存儲在各種數據庫中。當一個任務被存儲在持久化的存儲庫中時將被序列化,然后在加載到內存時被反序列化。

調度器之間不應該共用任務存儲。

executors 用於處理任務的執行。 讓預定的任務在線程或進程池中啟動,當任務結束后,執行器通知調度器什么時候進行合適的事件。

scheduler用於將所有的組建凝結起來。一個應用中通常只有一個調度器 

BlockingScheduler:用於當scheduler是進程里唯一運行的程序

BlockgroundScheduler:當你沒有使用以下任何一個調度器,並且希望scheduler在應用的后台運行時適用

AsyncIOScheduler :當應用中使用 asyncio module(異步io模塊)時適用

GeventScheduler :當應用中使用 gevent時適用

TornadoScheduler :當構建基於Tornado的應用時適用

TwistedScheduler: 當構建基於 TwistedScheduler的應用時適用

QtScheduler: 當構建 Qt 應用時適用

 

存儲器選擇

如果每次開啟應用時都會重建任務計划,則可以使用默認的內存存儲

如果你希望當scheduler重啟或應用宕機時,任務可以繼續的按計划執行 ,存儲器的選擇通常取決於開發環境中使用的工具。

如果你沒什么要求則推薦使用SQLAlchemyJobStore,以PostgreSQL作為存儲后端

 

執行器

通常取決於上述組建的選擇,不過,通常默認的執行器 ThreadPoolExecutor也足夠大多數任務了。如果任務中設計了cpu密集型操作,應該考慮ProcessPoolExecutor ,來使用多核CPU。

你甚至可以同時使用這兩個執行器,將進程池執行器添加為備選執行器

 

觸發器

trigger決定任務執行時間的邏輯。ASPcheduler內置三種觸發器:

date : 一次性的固定時間點執行任務

interval: 按周期循環執行任務

cron: 語法類似linux的定時任務cron

要組合多種triggers,也可實現 ,combining triggers ,見 https://apscheduler.readthedocs.io/en/latest/modules/triggers/combining.html#module-apscheduler.triggers.combining 

 

ASPchedulre提供多種配置方式 ,可以通過一個配置的dict或者作為可選關鍵字參數傳入。或者也可先實例化scheduler,添加任務,然后再配置scheduler,這種方式取得最大的靈活性。

完整的而配置說明見 https://apscheduler.readthedocs.io/en/latest/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler

 

例如,選用BackgroundScheduler ,使用默認的job store 和默認的executor:

from apscheduler.schedulers.background import BackgroundScheduler

scheduler=BackgroundScheduler()

這將會用名為”default"的MemoryJobStore ,名為“default"的ThreadPoolExecutor,默認線程池最大量為10的配置創建一個 BackgroundScheduler 。

例1

from pytz import utc 

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.jobstores.mongodb import MongoDBJobStore

from apscheduler.executors.pool import ThreadPoolExecutor,ProcessPoolExecutor 

jobstores={

'mongo':MongoDBJobStore(),

'default':SQLAlchemyJobStore(url='sqlite://jobs.sqlite')

}

executors={

'default':ThreadPoolExecutor(20),

'processpool':ProcessPoolExector(5)

}

job_defaults={

'coalesce':False,

'max_instances';3

}

scheduler=BackgroundScheduler(jonstores=jobstores,executors=executors,job_defaults,timezone=utc)

 

例2 

from apsshceduler.schedulers.background import BackgroundScheduler

scheduler=BackgroundScheduler({

'apscheduler.jonstores.mongo':{

  'type':'mongodb'

  },

'apscheduler.jobstores.default':{

  'type':'sqlalchemy',

  'url':'sqlite:///jobs.sqlite'

  },

'apscheduler.executors.default':{

  'class':'apscheduler.executors.pool:ThreadExecutor',

  'max_workers':'20'

  },

'apscheduler.executors.processpool':{

  'type':'processpool',

  'max_workers':'5'

  },

'apscheduler.job_defaults.coalesce':'false',

'apscheduler.job_defaults.max_instances':'3',

'apscheduler.timezone':'UTC',

  }

)

例3

from pytz import utc

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore

from apscheduler.executors.pool import ProcessPoolExecutor

jobstores={

'mongo':{'type':'mongodb'},

'default':SQLAlchemyJobStore(url='sqlite://jobs.sqlite')

}

executors={

'default':{'type':'threadpool','max_workers':20},

'processpool':ProcessPoolExecutor(max_workers=5)

}

job_defaults={

'coalesce':False,

'max_instances':3

}

scheduler=BackgroundScheduler()

scheduler,configure(jobstores=jobstores,executors=executors,job_defaults=job_defaults,timezone=utc)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM