by:陳澤榮 (timothychenpc@gmail.com)
日期:0128~0129
改動:
一、APScheduler的使用:
APScheduler
主要就是一個可以定時執行的函式庫,有三種觸發模式:cron
循環任務
date
單次任務
interval
間隔任務
然後又有這幾種形式:
BlockingScheduler
:use when the scheduler is the only thing running in your process
BackgroundScheduler
:run in thebackground inside your application
AsyncIOScheduler
:use if your application uses the asyncio module
GeventScheduler
:use if your application uses gevent
TornadoScheduler
:use if you’re building a Tornado application
TwistedScheduler
:use if you’re building a Twisted application
QtScheduler
:use if you’re building a Qt application
那我自然就是選擇
BackgroundScheduler
然後一開始測試的時候就先使用
interval
進行測試。但是後來發現了一個蠻奇怪的事情這邊在設定的時候是設定5秒為間隔定時觸發,觸發就會
print
當前的時間但是後來發現,執行的結果蠻詭異的。就是每一個完整的5秒內都多了一次觸發,然後通過api查詢當前任務也沒有。當下就感覺可能是因為什麼觸發導致了任務的複製,或者重複。
結果後來在
Stackoverflow
找到了答案,說是因為flask
的reloader
開啟的時候會在主線程地下產生一個子線程(複製了原線程),導致任務被重新觸發,造成這個情況。後來就是把
reloader
關掉就好了但不得不說postman是真的好用,尤其針對開發api和測試api(而且下一個專案就要來寫restful了)
二、整體的定時提醒系統
講完了
APScheduler
,順便講一下在這個專案中為什麼會用到APScheduler
以及我打算怎麼用好了首先為什麼會用到?
因為我們希望可以通過兩種形式將當天提醒的名單,當天待更換的名單同步出去。
linebot
訊息通知
- 網站即時顯示
linebot
的部分,就是每天固定一個時間傳送,通知我們的客戶。然後網站就稍微麻煩一點了,為了不給伺服器帶來太大的壓力,我比較不想沒20秒更新一次訊息。
反而,我想做的就是每天12點或者啟動的時候同步一次(這樣就是12點報錯重啟也還是可以同步),然後之後只要有針對資料進行修改(不管是前端觸發還是後端觸發),就強制觸發一次同步(可以通過
query string
的方式夾帶),這樣就可以不用一直搜索,也能保持資訊的即時性。怎麼使用?
綜上所以在啟動的時候就會查看
settings
裡面的notification-time
,然後設定一個定時,然後觸發就會先進行同步,同步完linebot push_message
推送到用戶那邊。另一個就是12點整的時候,觸發進行同步。
三、針對推送訊息的處理
原本的訊息長這樣,然後為了使用者的體驗,我做了一點點更改
然後程式碼的部分......因為有蠻多地方需要的,所以我就直接處理成函式了
然後後來就是原本的
search
也針對訊息的需要做了一些修改,但好在之前就有考量到有這樣的情況,所以提前預留了可以修改的空間,改起來還蠻快的所以到這邊,之後再修改一下,提醒系統應該就可以直接進入測試階段了。或者說可以等前端加進來了
心得:
我覺得目前進度還不錯,然後目前主程式(不包哈debug的那些)已經成長到200多行了,然後各種函式也是越寫越多,我現在心裏只有一個念頭,就是趕快把這些程式碼分出去(依功能分到其他檔案,然後再各自組成封包)。還有就是當我弄了很長時間,然後終於弄出結果的時候,就會控制不住自己,開始一直玩那個結果(覺得很療癒哈哈)。
然後呢,我其實覺得專案開發的這一週的時間,還蠻有收穫的,首先是每天的開發日誌,然後每天的進展,就是把這些東西紀錄下來,然後再看的時候就有一種很爽的感覺(不知道為什麼)
還有就是我這每一天的開發日誌都要寫好久(可能都要1小時多),所以我打算之後可能就在寫code的時候就拿一張紙在旁邊,有重點就紀錄下來,這樣之後寫開發日誌才不會花那麼久想我到底做了什麼(哈哈