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通过websocket与js客户端通信示例分析
Jun 25 Python
探究Python中isalnum()方法的使用
May 18 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
python安装读取grib库总结(推荐)
Jun 24 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
Python中的套接字编程是什么?
Jun 21 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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中的插件机制原理和实例
2014/07/08 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
详解python中asyncio模块
2018/03/03 Python
python 图片去噪的方法示例
2019/07/09 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
个人培训自我鉴定
2014/03/28 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
暑期学习心得体会
2014/09/02 职场文书
擅自离岗检讨书
2014/09/12 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
《检阅》教学反思
2016/02/22 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL
Python之matplotlib绘制折线图
2022/04/13 Python