前言

用的yolov5,作者自己写的loadStream函数就是依据 streams.txt里面的rtsp流地址列表来新建线程,然后实现多路监控的。


大体就是这个图里面说的,我已经是为了个整体业务,去小改了这个loadStreams方法,将那些可用的rtsp流地址保存到一个新的list里面,然后再新建线程。

如何检验可用与否,就是用opencv VideoCapture.isOpened() 慢慢去试,连不上就剔除

上面这个流程,是蠢(还想着定时任务,隔一会重启一下服务器,其实就是潜意识里,想用最直接(不动脑子)的方法糊弄这个问题)。跟老师一说,老师也是说,还是改成触发器吧。拖了十天了,今天趁着还没有干别的事情,脑子还能转起来,来学一下。

技能要求

监听数据库,然后 读写最新数据库信息到文件,然后利用文件重新启动服务器。

准备工作

  1. pycharm新建一个python文件
  2. nacicat 打开自己的数据库
  3. 找一篇 python监听数据库表变化的博客

再去找博客的时候,(我其实之前是找了一些了的),但大多都是对数据库进行轮询,也就是和我上面的定时任务差不多了。可我想要的是触发器,只有当数据库改变的时候,才会执行,这样才叫触发嘛,一直盯着,那叫监控。

然后就看到了这条

确实,那思路就从监听数据库 转变为 用mysql的触发器然后生成的日志文件(只生成rtsp地址那一列变动的日志),然后再用python的watchdog(这个是轮子Python 监控文件增加、修改、删除等变化)监听这个日志文件。 这样就不用监听数据库了,变成了监听文件。(主要是同事的数据库连起来很慢,所以能不监听就不监听。)
另外一个想法,想着能不能通过mysql的触发器,直接调用python服务重启的脚本。这就牵扯到,这个脚本是不是也要放到同事数据库所在的那台机子上。如果是我这个想法的话,那我上面需要监听的那个日志文件,肯定也是在数据库的本机地址上生成的呀,可是我的服务器是部署在autodl的docker里面的,这两个又要怎么互通呢?
好麻烦,要不就 轮询数据库得了。

后期要是这个东西真的要上线的话,那数据库肯定也是在服务器上的吧。mysql部署在docker那就是说日志文件和我项目的代码是在一个地方的。
如果是一个地方的话,那自己访问自己肯定很快的呀,轮询是可以的;或者然后设定触发器,监控触发器生成的文件也是可以的;或者触发器触发然后调用python重启脚本也是可以的。

那暂时不知道未来是什么情况,就把上述可行的路子都看一下。

轮询

写脚本 轮询 写的挺好,罗列了两种需要监听的类型——新增和改变
我业务里面也主要就是处理新增的那些数据,如何将它们加入到streams.txt,所以我就可以在轮询的回调方法那里写“将数据写入streams.txt的文件操作”。
我把他这个代码排版好了之后,就是如下:

import os
import sys
import time
import threading
import pickle
import pymysqlclass BaseListener(object):# 使用一个线程启动监听def __init__(self):self.checkpoint = 0self.stop_flag = Trueself.listen_thread = threading.Thread(name="Listener", target=self.do_listen)self.listen_thread.start()def start(self):self.stop_flag = Falsedef stop(self):self.stop_flag = Truedef set_checkpoint(self, v):# 设置监听的断点,如果需要可以持久存储在磁盘上self.checkpoint = vdef get_checkpoint(self):return self.checkpointdef do_listen(self):filename = 'utils/streams.txt'with open(filename, 'w') as f:f.write('')cnt=0while True:if not self.stop_flag:conn = pymysql.connect(host="localhost", user="root", password="123456", charset='utf8')# 监听用sql语句,应当以id倒排,需要使用 WHERE id > {CHECK_POINT}进行筛选,如# sql = "SELECT * FROM a WHERE id>{CHECK_POINT} ORDER BY id DESC"cursor = conn.cursor()sql = "SELECT id,monitor_name FROM `fall`.`monitor` WHERE id>{CHECK_POINT}"checkpoint = self.get_checkpoint()sql_listen = sql.replace("{CHECK_POINT}", str(checkpoint))# fetchall为读取全部记录的语句cursor.execute(sql_listen)# 获取所有记录列表results = cursor.fetchall()#记录最后一个游标rec_id =""if(len(results)!=0):cnt += len(results)rec_id = self.callback(results,cnt)self.set_checkpoint(rec_id)# 关闭数据库连接cursor.close()conn.close()# 根据情况设置轮询时间time.sleep(1)def callback(self,data):filename = 'utils/streams.txt'# 这是do_listen调用的一个回调函数,把数据传过来处理,在子类中实现with open(filename, 'a+') as f:f.write(data)class BaseMonitor(object):"""监听数据变化的基类"""def __init__(self):self.prev_data = Noneself.stop_flag = Trueself.monitor_thread = threading.Thread(name="Monitor", target=self.do_monitor)self.monitor_thread.start()def start(self):self.stop_flag = Falsedef stop(self):self.stop_flag = Truedef do_monitor(self):while True:if not self.stop_flag:self.execute(self.extra_sql)data = self.fetchall(self.base_sql)if data:str_data = pickle.dumps(data)if str_data != self.prev_data:self.callback(data)self.prev_data = str_datadef callback(self, dictdata):# 这是do_monitor调用的一个回调函数,把数据传过来处理,在子类中实现print"Should be implemented in subclasses!"
class Listener(BaseListener):def callback(self, data,cnt):filename = 'utils/streams.txt'if(cnt!=len(data)):p = sys.executableos.execl(p, p, *sys.argv)rec_id=""# 这是do_listen调用的一个回调函数,把数据传过来处理,在子类中实现with open(filename, 'a+') as f:for i, row in enumerate(data):ip = row[1]if(i==0):f.write(ip)else:f.write('\n'+ip)rec_id = row[0]return rec_idclass MonitorTest(BaseMonitor):def callback(self, dictdata):print"Monitor:",dictdataif __name__ == "__main__":ad = Listener()ad.start()

其余两个 有机会再写吧
监控日志 触发器调用脚本
然后这个重启功能,在这篇博客表头有提到,所以在pycharm上面无法成功演示,但在服务器linux上应该就ok了。

windows下任务管理器中运行在pycharm或者其他ide下的python应用程序,我们知道此时pycharm是进程,而运行的.py文件是线程功能,这样如果监测进程实现起来比较繁琐,因此可以将.py文件转换为.exe文件使用pyinstaller将py文件转换成.exe可执行文件,这样在windows直接执行.exe文件*

所以任务就这样了,最后还是选择了,轮询的方法,然后每次都是讲streams.txt文档清空,重新写入,当第一次这批写入之后的下一次,就重启。(因为我要重启,重启之后,那些记录的标记呀,都没有了,在博客案例里面,还指望这个标记去记录,然后方便下一次查询)
所以我就是把 记录的数量记录了一下,如果数量增加,我就重启。《——对 我已经变成这个逻辑了
okokok
烦死了,自己太垃了,这么个小功能,吭哧了四五个小时。

【做一下1】python 监听数据库变化相关推荐

  1. linkedin databus介绍——监听数据库变化,有新数据到来时通知其他消费者app,新数据存在内存里,多份快照...

    概要结构如下图. 图中显示:Search Index和Read Replicas等系统是Databus的消费者.当主OLTP数据库发生写操作时,连接其上的中继系统会将数据拉到中继中.签入在Search ...

  2. 基于Canal+kafka监听数据库变化的最佳实践

    1.前言 工作中,我们很多时候需要根据某些状态的变化更新另一个业务的逻辑,比如订单的生成,成交等,需要更新或者通知其他的业务.我们通常的操作通过业务埋点.接口的调用或者中间件完成. 但是状态变化的入口 ...

  3. 01 canal监听数据库变化

    1.cannal 1.1 canal简介 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据. canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的 ...

  4. python监听文件最后修改人_Python持续监听文件变化代码实例

    在日常的工作中,有时候会有这样的需求,需要一个常驻任务,持续的监听一个目录下文件的变化,对此作出回应. pyinotify就是这样的一个python包,使用方式如下: 一旦src.txt有新的内容,程 ...

  5. SQL Server CDC配合Kafka Connect监听数据变化

    写在前面 好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备.组建.招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇. 进入主题, ...

  6. android 监听图库变化,Android ContentObserver 监听图库变化

    电脑环境是XP,软件是gVim7.3,安装在C盘的 Program Files 下.如何设置gVim的字体和背景颜色:C---Program Files---Vim---_vimrc文件,用文本编辑器 ...

  7. Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动

    为了便于进行 系统级别的消息通知,Android引入了一套广播消息机制. 1.广播机制简介: 因为Android中的每个应用程序都可以对自己感兴趣的广播尽心注册,这样程序只会接收自己所关心的广播内容, ...

  8. 监听文件变化并自动运行 npm script

    监听文件变化并自动运行 npm script 软件工程师做的事情基本都是在实现自动化,比如各种业务系统是为了业务运转的自动化,部署系统是为了运维的自动化,对于开发者本身,自动化也是提升效率的关键环节, ...

  9. reactrouter监听路由变化_一篇文章搞懂前端路由原理解析和实现方式

    在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂. 想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理 ...

最新文章

  1. python 空指针_python 空指针
  2. ATS 5.3.0中按域名生成日志配置文件log_hosts.config解读
  3. 莱维飞行matlab作图,基于莱维飞行和随机游动策略的灰狼算法
  4. 远程桌面连接超出最大连接数的问题
  5. MySQL空密码用户清理
  6. [小改进]在个人Blog页面显示文章阅读数
  7. 细学PHP 09 MySql
  8. (连通图 ) Redundant Paths --POJ --3177
  9. android内核读取file文件
  10. 【电力负荷预测】基于matlab SVM短期电力负荷预测【含Matlab源码 280期】
  11. 机器学习算法之SVM的多分类
  12. Systemd基础篇:systemd vs SysVinit
  13. 计算机和现代通讯的应用,现代计算机通信技术特点及通信网络的应用.docx
  14. elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
  15. Windows安装mysql8并设置开机自启动
  16. Python交流QQ群
  17. 雷电模拟器通过命令行设置分辨率及其他命令
  18. 运放的 零点和极点快速找到
  19. 多边形的单边裁剪算法-JS
  20. 《CSAPP》(第3版)答案(第三章)(一)

热门文章

  1. 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
  2. Deep Learning for Video Game Playing《DQN 在电子游戏中的应用》
  3. es中的ActionListener
  4. 优秀是一种习惯,习惯却是来自于思维的境界
  5. c语言 不编译一段代码,为什么同一个程序.c就可以.cpp就无法编译
  6. ospf不连续区域网络互通
  7. 运动目标检测之光流法(4)LK金字塔论文翻译
  8. (Java实现) 自然数的拆分
  9. Wannafly交流赛1 _A_有理数 【水】
  10. CSS中边偏移属性top,right,bottom,left