健康码项目笔记, python之flask框架内新增搭建api(二)

创作不易 只因热爱!!
**

热衷分享,一起成长!


这两三天我在默默付出, 朋友,请为我点个赞! 谢谢!
“你的鼓励就是我努力付出的动力”!!
洪水无情,希望大家都平平安安,健康快乐!
在这里插入图片描述

1. 上次项目使用asyncio,以求并行同时运行.其实结果…

代码和实际预期差远了,我运行了很多次都是一直先执行handle_get_localdata(), 不管我在哪个里面加入time.sleep(1)~time.sleep(30).结果依旧…

不知道是python 的GIL锁有原因还是 flask 框架原因.有兴趣的小伙伴可以自行测试!!!
具体原因我就不探究了.我只能用先后访问.当然是先访问本地资源,后访问远程服务资源. 有两个结果, 但是执行过程不能这么干.
于是先引入ping远程服务资源, 是否掉线. 掉线就直接返回本地资源.不掉线,取远程服务资源.

2. 流程图变更

上面分析过, 多进程无法并行执行. python 的GIL锁原因或是 flask 框架原因.

状态, 时间 写入
状态, 时间 读取
Yes
No
进程1- 循环
ping 服务器. 每5min
temp表
系统脚本或计划任务完成
进程2 - Api
temp表
服务是否通畅
从服务器调取资源
从本地调取资源

搜索解决方案: 要么使用 subprocess调用或者 使用任务调度python.

ping远程服务资源, 是否掉线的状态. 我这里有4个api, 每个执行去ping一次也太不合适了. 于是有写个脚本放到计划任务中, 循环执行(也可以是类似心跳检测机制).然后在api里面调用实时状态.

3. 计划任务脚本python 使用sqlite3数据库进行简单的状态,时间记录.

顺便学习一波python库 sqlalchemy 操作sqlite3数据库 用法

import os, subprocess
from sqlalchemy import create_engine, text, Column, Integer, String, Sequence
from sqlalchemy.orm import declarative_base, sessionmaker
import time

remote_ip = '10.10.10.10'

# sqlite3 DB放置位置
database_path = '/path/to/file/jkkping.db'
# 创建或声明使用一个SQLite数据库引擎
engine = create_engine(f'sqlite:///{database_path}')
# 创建一个用于数据库交互的Session类,类似conn连接 . 使用 session= Session() 类似 cursur游标
Session = sessionmaker(bind=engine)

# 定义Jkk类 , 表名称jkkping, 字段rtime时间, mark状态
Base = declarative_base()
class Jkk(Base):
    __tablename__ = 'jkkping'

    rtime = Column(Integer, primary_key=True)
    mark = Column(Integer, nullable=False)
    
# 创建"jkkping"表时使用, 已创建表不再使用
# Base.metadata.create_all(engine)

# sqlite3 DB 新增数据,单条数据 .多条新增session.add_all([insert_jkk1,insert_jkk2])
def sqlite_insert(insert_jkk, session, result):
    session.add(insert_jkk)
    session.commit()

# sqlite3 DB 删除数据
def sqlite_delete(delete_jkk, session):
    if delete_jkk:
        session.delete(delete_jkk)
        session.commit()
        
# 以下仅供示例学习
# # sqlite3 DB 更新数据        
# def sqlite_update(update_jkk, session):
#     update_jkk = session.query(Jkk).filter(Jkk.rtime >=int(10*time.time()) - 3144).order_by(-Jkk.rtime).first()
#     if update_jkk:
#         update_jkk.mark = 1
#         session.commit()
        
# # sqlite3 DB 查询最大时间单条数据,即最新数据      
# def sqlite_query_maxtime(session):
#     specific_jkk = session.query(Jkk).order_by(-Jkk.rtime).first()
#     if specific_jkk:
#         print(specific_jkk.rtime, specific_jkk.mark)

# # sqlite3 DB 查询sql, 注意必须 text(sql) 使用, 才能类似其他cursur.execute()操作.       
# def sqlite_query(sql, session):
#     # sql = "Select rtime, mark from jkkping order by rtime desc limit 3"
#     specific_jkk = session.execute(text(sql))
#     if specific_jkk:
#         for row in specific_jkk:
#             print(row)

# 定义函数ping远程服务器是否可用. 可用返回 0 ,不可用返回 1
def canConnect():
    fnull = open(os.devnull, 'w')
    result = subprocess.call(f'ping {remote_ip} -c4 -w15', shell = True, stdout = fnull, stderr = fnull)
    fnull.close()
    return result
        
if __name__ == '__main__':    
    # 循环大概每5分钟执行一次心跳机制. 获取远程服务状态. 新增到jkkping中, 这里并不是每次更新表值, 避免可能的并发.
    first_time = None
    while True:
        result = canConnect()
        
        session = Session()
        thistime = int(10*time.time())
        insert_jkk = Jkk(rtime=thistime, mark=result)
        sqlite_insert(insert_jkk, session, result)
        session.close()   
        
        time.sleep(5)
        # 运行一段时间定时删除一些数据, 使表数据量保持较少,方便排序快取读取
        if first_time ==None or first_time >= 88888:
            session = Session()
            delete_jkk = session.query(Jkk).filter(Jkk.rtime<=thistime-44444).all()
            sqlite_delete(delete_jkk, session)
            session.close()  
            first_time = None
        first_time += int(10*time.time())-thistime
        
        time.sleep(280)

记得把这个脚本放入开机任务计划…本期暂写到此
**想了解更多,欢迎添加好友!
下期敬请期待
end

^**你好呀,我是一个医信行业工程师,喜欢学习,喜欢搞机,喜欢各种捣,也会持续分享,如果喜欢我,那就关注我吧!**^


往期精彩:
健康码项目笔记, python之flask框架内新增搭建api(一)
笔记: 迷你主机Linux平台安装, 采集盒COM连接呼吸机 (一)
笔记: 迷你主机Linux平台安装, 采集盒COM连接呼吸机 (二)
笔记: 迷你主机Linux平台安装, 采集盒COM连接呼吸机 (三)
笔记: 迷你主机Linux平台安装, 采集盒COM连接呼吸机 (四)

作者|医信工程师随笔|Carltiger_github

图片|AI|侵删

关注我,我们共同成长

“你的鼓励就是我分享的动力”

  • 35
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值