国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python 定時修改數據庫的示例代碼

2020-02-22 23:37:42
字體:
來源:轉載
供稿:網友

當需要定時修改數據庫時,一般我們都選擇起一個定時進程去改庫。如果將這種定時任務寫入業務中,寫成一個接口呢,定時進程顯得有些不太合適?如果需要定時修改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 Tablefrom handler.base_handler import BaseHandlerfrom threading import Timerimport datetimeclass 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定時執行的方法比傳統的定時進程更輕量,也更簡單,但是也有著明顯的缺點。當服務關閉時,所有的定時線程也就隨著主進程一起銷毀,所有線程都能成功執行的前提條件是服務必須穩定,不能重啟。如果想要重啟服務,就需要想辦法將未完成的任務落盤(比如寫到數據庫中),然后啟動服務時讀取之前未完成的任務重新創建定時線程。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台州市| 姜堰市| 大厂| 青岛市| 乌鲁木齐市| 威远县| 皋兰县| 芦溪县| 闸北区| 洱源县| 山丹县| 灵石县| 伊宁县| 武强县| 吴堡县| 成都市| 咸丰县| 益阳市| 高碑店市| 灵武市| 湘潭市| 即墨市| 溆浦县| 饶阳县| 多伦县| 青岛市| 肥西县| 平顶山市| 庆元县| 家居| 安平县| 民乐县| 贡嘎县| 西充县| 长治市| 玉山县| 中江县| 江达县| 保定市| 同江市| 五大连池市|