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的id()函数解密过程
Dec 25 Python
python基础教程之字典操作详解
Mar 25 Python
Python标准库之循环器(itertools)介绍
Nov 25 Python
python3简单实现微信爬虫
Apr 09 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
python+django加载静态网页模板解析
Dec 12 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
Python如何获取文件路径/目录
Sep 22 Python
如何使用python自带IDLE的几种方法
Oct 10 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
我的论坛源代码(八)
2006/10/09 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python实现跨文件全局变量的方法
2014/07/07 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
Python字符串及文本模式方法详解
2020/09/10 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
医学生自我鉴定范文
2013/11/08 职场文书
奠基仪式策划方案
2014/05/15 职场文书
论文诚信承诺书
2014/05/23 职场文书
综治工作汇报材料
2014/10/27 职场文书
自查自纠整改报告
2014/11/06 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers