python 定时修改数据库的示例代码


Posted in Python onApril 08, 2018

当需要定时修改数据库时,一般我们都选择起一个定时进程去改库。如果将这种定时任务写入业务中,写成一个接口呢,定时进程显得有些不太合适?如果需要定时修改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复制文件代码实现
Dec 23 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
Python中with及contextlib的用法详解
Jun 08 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
Python Pygame实现俄罗斯方块
Feb 19 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
进行数据处理的6个 Python 代码块分享
Apr 06 Python
对Python中DataFrame按照行遍历的方法
Apr 08 #Python
python2.6.6如何升级到python2.7.14
Apr 08 #Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 #Python
利用Pandas 创建空的DataFrame方法
Apr 08 #Python
django启动uwsgi报错的解决方法
Apr 08 #Python
python 2.7.14安装图文教程
Apr 08 #Python
详解Python中的动态属性和特性
Apr 07 #Python
You might like
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
js自动生成对象的属性示例代码
2013/10/28 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
Python 模拟购物车的实例讲解
2017/09/11 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python redis 删除key脚本的实例
2019/02/19 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
后勤副校长自我鉴定
2013/10/13 职场文书
函授毕业生自我鉴定
2013/11/06 职场文书
医学求职自荐信
2014/06/21 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
刑事案件上诉状
2015/05/23 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python