创作不易 只因热爱!!
**
热衷分享,一起成长!
这两三天我在默默付出, 朋友,请为我点个赞! 谢谢!
“你的鼓励就是我努力付出的动力”!!
洪水无情,希望大家都平平安安,健康快乐!
1. 上次项目使用asyncio,以求并行同时运行.其实结果…
代码和实际预期差远了,我运行了很多次都是一直先执行handle_get_localdata(), 不管我在哪个里面加入time.sleep(1)~time.sleep(30).结果依旧…
不知道是python 的GIL锁有原因还是 flask 框架原因.有兴趣的小伙伴可以自行测试!!!
具体原因我就不探究了.我只能用先后访问.当然是先访问本地资源,后访问远程服务资源. 有两个结果, 但是执行过程不能这么干.
于是先引入ping远程服务资源, 是否掉线. 掉线就直接返回本地资源.不掉线,取远程服务资源.
2. 流程图变更
上面分析过, 多进程无法并行执行. python 的GIL锁原因或是 flask 框架原因.
搜索解决方案: 要么使用 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|侵删
关注我,我们共同成长
“你的鼓励就是我分享的动力”