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的迭代器与生成器实例详解
Jul 16 Python
Python输出9*9乘法表的方法
May 25 Python
解析Python中的__getitem__专有方法
Jun 27 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
Java文件与类动手动脑实例详解
Nov 10 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
python str字符串转uuid实例
Mar 03 Python
python使用多线程+socket实现端口扫描
May 28 Python
Django nginx配置实现过程详解
Sep 10 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
Pandas的数据过滤实现
Jan 15 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
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
使用async await 封装 axios的方法
2018/07/09 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
python生成随机验证码(中文验证码)示例
2014/04/03 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python中的self用法详解
2019/08/06 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python MD5加密的示例
2020/10/19 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
医学生自荐信
2013/12/03 职场文书
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
建筑工地质量标语
2014/06/12 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
焦裕禄观后感
2015/06/03 职场文书
思想品德课教学反思
2016/02/24 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python