當(dāng)需要定時修改數(shù)據(jù)庫時,一般我們都選擇起一個定時進(jìn)程去改庫。如果將這種定時任務(wù)寫入業(yè)務(wù)中,寫成一個接口呢,定時進(jìn)程顯得有些不太合適?如果需要定時修改100次數(shù)據(jù)庫,常規(guī)做法會啟動100個進(jìn)程,雖然這種進(jìn)程非常輕量級,但還是會感覺不爽。實際上我們可以使用threading.Timer創(chuàng)建相應(yīng)的線程來執(zhí)行改庫操作,思路也比較簡單。
1.傳入執(zhí)行改庫操作的時間update_time,用update_time和當(dāng)前時間相減法,得到距離改庫操作還有多少時間time_delay。求兩個標(biāo)準(zhǔn)時間格式字符串的時間差可以使用datetime.datetime.strptime()來格式化時間,格式化后的時間可以直接相減法,對結(jié)果執(zhí)行.seconds()就可以轉(zhuǎn)化成秒
2.將改庫操作封裝成方法update(),然后將update和時間差傳入threading.Timer創(chuàng)建的線程,用法為threading.Timer(interval,function,args=[],kwargs={})創(chuàng)建線程實例,interval為延遲執(zhí)行的時間,單位是秒,然后,start()執(zhí)行。Timer是非阻塞的,可以創(chuàng)建出多個線程互不影響。
可以將update_time改為前端傳入的參數(shù),就可以在該時間執(zhí)行改庫操作了。當(dāng)時遇到了一個小坑,就是改庫操作沒有生效,原因是沒加最后一行的commit()。本來改庫的commit生效是寫在基類BaseHandler重的,但是這里的update()在Timer線程中執(zhí)行,屬于異步操作,需要在線程中執(zhí)行commit()使改動生效。
這種借助Timer定時執(zhí)行的方法比傳統(tǒng)的定時進(jìn)程更輕量,也更簡單,但是也有著明顯的缺點。當(dāng)服務(wù)關(guān)閉時,所有的定時線程也就隨著主進(jìn)程一起銷毀,所有線程都能成功執(zhí)行的前提條件是服務(wù)必須穩(wěn)定,不能重啟。如果想要重啟服務(wù),就需要想辦法將未完成的任務(wù)落盤(比如寫到數(shù)據(jù)庫中),然后啟動服務(wù)時讀取之前未完成的任務(wù)重新創(chuàng)建定時線程。
以上內(nèi)容為大家介紹Python定時修改數(shù)據(jù)庫,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.hangjiakeji.com/