python定时任务启动与停止_python定时任务最强框架APScheduler详细教程
APScheduler定時任務
上次測試女神聽了我的建議,已經做好了要給項目添加定時任務的決定了。但是之前提供的四種方式中,她不知道具體選擇哪一個。為了和女神更近一步,我把我入行近10年收藏的干貨免費拿出來分享給女神,希望女神凌晨2點再找我的時候,不再是因為要給他調程序了。
Python中定時任務的解決方案,總體來說有四種,分別是:crontab、 scheduler、 Celery、 APScheduler,其中 crontab不適合多臺服務器的配置、scheduler太過于簡單、 Celery依賴的軟件比較多,比較耗資源。最好的解決方案就是 APScheduler。
APScheduler使用起來十分方便。提供了基于日期、固定時間間隔以及 crontab類型的任務。還可以在程序運行過程中動態的新增任務和刪除任務。在任務運行過程中,還可以把任務存儲起來,下次啟動運行依然保留之前的狀態。另外最重要的一個特點是,因為他是基于 Python語言的庫,所以是可以跨平臺的,一段代碼,處處運行!
在這里我來給大家詳細介紹一下具體的用法。
一、安裝:
安裝非常簡單,通過 pip install apscheduler即可。
二、基本使用:
先來看一段代碼,然后再來給大家詳細講解其中的細節:
其中 BlockingScheduler是阻塞性的調度器,是最基本的調度器,下面調用 start方法就會阻塞當前進程,所以如果你的程序除了調度進程沒有其他后臺進程,那么是可以是否的,否則這個調度器會阻塞你程序的正常執行。
接下來就是定義一個 my_clock函數,這個函數就是需要定時調度的任務代碼。
然后就是實例化一個 BlockingScheduler對象,并把 my_clock添加到任務調度中。然后看 interval參數,這里用的是間隔的方式來調度,調度頻率是 seconds=3,也就是每3秒執行一次。
執行結果如下:
可以看到每隔3秒鐘的時間會執行一次。說明定時任務已經成功執行了!
在了解了 APScheduler的基本使用后,再來對 APScheduler的四個基本對象做個了解,這樣才能從全局掌握 APScheduler。
三、四個基本對象:
1. 觸發器(triggers):
觸發器就是根據你指定的觸發方式,比如是按照時間間隔,還是按照 crontab觸發,觸發條件是什么等。每個任務都有自己的觸發器。
2. 任務存儲器(job stores):
任務存儲器是可以存儲任務的地方,默認情況下任務保存在內存,也可將任務保存在各種數據庫中。任務存儲進去后,會進行序列化,然后也可以反序列化提取出來,繼續執行。
3. 執行器(executors):
執行器的目的是安排任務到線程池或者進程池中運行的。
4. 調度器(schedulers):
任務調度器是屬于整個調度的總指揮官。他會合理安排作業存儲器、執行器、觸發器進行工作,并進行添加和刪除任務等。調度器通常是只有一個的。開發人員很少直接操作觸發器、存儲器、執行器等。因為這些都由調度器自動來實現了。
四、觸發器:
觸發器有兩種,第一種是 interval,第二種是 crontab。interval可以具體指定多少時間間隔執行一次。crontab可以指定執行的日期策略。以下分別進行講解。
1. date觸發器:
在某個日期時間只觸發一次事件。示例代碼如下:
2. interval觸發器:
想要在固定的時間間隔觸發事件。interval的觸發器可以設置以下的觸發參數:weeks:周。整形。
days:一個月中的第幾天。整形。
hours:小時。整形。
minutes:分鐘。整形。
seconds:秒。整形。
start_date:間隔觸發的起始時間。
end_date:間隔觸發的結束時間。
jitter:觸發的時間誤差。
3. crontab觸發器:
在某個確切的時間周期性的觸發事件。可以使用的參數如下:year:4位數字的年份。
month:1-12月份。
day:1-31日。
week:1-53周。
day_of_week:一個禮拜中的第幾天( 0-6或者 mon、 tue、 wed、 thu、 fri、 sat、 sun)。
hour: 0-23小時。
minute: 0-59分鐘。
second: 0-59秒。
start_date: datetime類型或者字符串類型,起始時間。
end_date: datetime類型或者字符串類型,結束時間。
timezone:時區。
jitter:任務觸發的誤差時間。
也可以用表達式類型,可以用以下方式:
示例如下:
五、調度器:BlockingScheduler:適用于調度程序是進程中唯一運行的進程,調用 start函數會阻塞當前線程,不能立即返回。
BackgroundScheduler:適用于調度程序在應用程序的后臺運行,調用 start后主線程不會阻塞。
AsyncIOScheduler:適用于使用了 asyncio模塊的應用程序。
GeventScheduler:適用于使用 gevent模塊的應用程序。
TwistedScheduler:適用于構建 Twisted的應用程序。
QtScheduler:適用于構建 Qt的應用程序。
六、任務存儲器:
任務存儲器的選擇有兩種。一是內存,也是默認的配置。二是數據庫。使用內存的方式是簡單高效,但是不好的是,一旦程序出現問題,重新運行的話,會把之前已經執行了的任務重新執行一遍。數據庫則可以在程序崩潰后,重新運行可以從之前中斷的地方恢復正常運行。有以下幾種選擇:MemoryJobStore:沒有序列化,任務存儲在內存中,增刪改查都是在內存中完成。
SQLAlchemyJobStore:使用 SQLAlchemy這個 ORM框架作為存儲方式。
MongoDBJobStore:使用 mongodb作為存儲器。
RedisJobStore:使用 redis作為存儲器。
七、執行器:
執行器的選擇取決于應用場景。通常默認的 ThreadPoolExecutor已經在大部分情況下是可以滿足我們需求的。如果我們的任務涉及到一些 CPU密集計算的操作。那么應該考慮 ProcessPoolExecutor。然后針對每種程序, apscheduler也設置了不同的 executor:ThreadPoolExecutor:線程池執行器。
ProcessPoolExecutor:進程池執行器。
GeventExecutor: Gevent程序執行器。
TornadoExecutor: Tornado程序執行器。
TwistedExecutor: Twisted程序執行器。
AsyncIOExecutor: asyncio程序執行器。
八、定時任務調度配置:
這里我們用一個例子來說明。比如我想這樣配置執行器:配置 default執行器為 ThreadPoolExecutor,并且設置最多的線程數是20個。
<
存儲器:配置 default的任務存儲器為 SQLAlchemyJobStore(使用SQLite)。
<
任務配置:
設置 coalesce為 False:設置這個目的是,比如由于某個原因導致某個任務積攢了很多次沒有執行(比如有一個任務是1分鐘跑一次,但是系統原因斷了5分鐘),如果 coalesce=True,那么下次恢復運行的時候,會只執行一次,而如果設置 coalesce=False,那么就不會合并,會5次全部執行。
max_instances=5:同一個任務同一時間最多只能有5個實例在運行。比如一個耗時10分鐘的job,被指定每分鐘運行1次,如果我 max_instance值5,那么在第6~10分鐘上,新的運行實例不會被執行,因為已經有5個實例在跑了。
那么代碼如下:
九、任務操作:
1. 添加任務:
使用 scheduler.add_job(job_obj,args,id,trigger,**trigger_kwargs)。
2. 刪除任務:
使用 scheduler.remove_job(job_id,jobstore=None)。
3. 暫停任務:
使用 scheduler.pause_job(job_id,jobstore=None)。
4. 恢復任務:
使用 scheduler.resume_job(job_id,jobstore=None)。
5. 修改某個任務屬性信息:
使用 scheduler.modify_job(job_id,jobstore=None,**changes)。
6. 修改單個作業的觸發器并更新下次運行時間:
使用 scheduler.reschedule_job(job_id,jobstore=None,trigger=None,**trigger_args)
7. 輸出作業信息:
使用 scheduler.print_jobs(jobstore=None,out=sys.stdout)
十、異常監聽:
當我們的任務拋出異常后,我們可以監聽到,然后把錯誤信息進行記錄。示例代碼如下:from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
import datetime
import logging
# 配置日志顯示
以上便是 APScheduler庫的詳細用法了。如果我們需要在項目中開一個定時功能,完全可以選擇 APScheduler,輕量又功能強大。
這次女神再也不用2點跑到公司去加班啦~
詳細了解請加vx:zhiliaoketang008
總結
以上是生活随笔為你收集整理的python定时任务启动与停止_python定时任务最强框架APScheduler详细教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SaaS服务应用集成和生态该何去何从
- 下一篇: mysql批量插入on duplicat