這篇文章主要介紹了python 定時修改資料庫的範例程式碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
當需要定時修改資料庫時,一般我們都會選擇起一個定時進程去改庫。如果將這種定時任務寫入業務中,寫成一個介面呢,定時進程顯得有些不太適合?如果需要定時修改100次資料庫,常規做法會啟動100個進程,雖然這種進程非常輕量級,但還是會覺得不爽。實際上我們可以使用threading.Timer建立對應的執行緒來執行改庫操作,思路也比較簡單。
1.傳入執行改庫操作的時間update_time,用update_time和當前時間相減法,得到距離改庫操作還有多少時間time_delay。求兩個標準時間格式字串的時間差可以使用datetime.datetime.strptime()來格式化時間,格式化後的時間可以直接相減法,對結果執行.seconds()就可以轉換成秒
#2.將改庫操作封裝成方法update(),然後將update和時間差傳入threading.Timer創建的線程,用法為threading.Timer(interval, function, args=[], kwargs={})創建執行緒實例,interval為延遲執行的時間,單位是秒,然後,start()執行。 Timer是非阻塞的,可以創造出多個執行緒互不影響。
程式碼如下
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from model import Table from handler.base_handler import BaseHandler from threading import Timer import datetime class TimeHandler(BaseHandler): def do_action(self): update_time = "2018-04-07 18:00:00" ads_id = "test_1" t_online = datetime.datetime.strptime(update_time, '%Y-%m-%d %H:%M:%S') now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') t_now = datetime.datetime.strptime(now, '%Y-%m-%d %H:%M:%S') time_delay = (t_online - t_now).seconds t1 = Timer(time_delay, self.update, (ads_id, )) t1.start() self.result = "success" return def update(self, ads_id): self.db.dsp.query(Table).filter(Table.ads_id == ads_id).update({Table.is_del: 0}) self.db.dsp.commit()
#可以將update_time改為前端傳入的參數,就可以在該時間執行改庫操作了。當時遇到了一個小坑,就是改庫操作沒有生效,原因是沒加最後一行的commit()。原本改函式庫的commit生效是寫在基類BaseHandler重的,但是這裡的update()在Timer執行緒中執行,屬於非同步操作,需要在執行緒執行commit()使改變生效。
這種借助Timer定時執行的方法比傳統的定時進程更輕量,也更簡單,但是也有明顯的缺點。當服務關閉時,所有的定時執行緒也隨著主進程一起銷毀,所有執行緒都能成功執行的前提條件是服務必須穩定,不能重新啟動。如果想要重新啟動服務,就需要想辦法將未完成的任務落盤(例如寫到資料庫中),然後啟動服務時讀取之前未完成的任務重新建立定時執行緒。
相關推薦:
以上是python 定時修改資料庫的範例程式碼_python的詳細內容。更多資訊請關注PHP中文網其他相關文章!