pyhton django web集群基于linux定时任务
基于django management/commands目录下的脚本
from django.core.management import BaseCommand
import logging
import uuid
from pia.utils.cache import reset_redis_expire
from pia.utils.reids_key import TASK_KEYlogging = logging.getLogger('task')"""
定时任务: 定时任务 看门狗续时
"""class Command(BaseCommand):def add_arguments(self, parser):parser.add_argument('trace_id', type=str)def handle(self, *args, **options):trace_id = options["trace_id"]if not trace_id:trace_id = str(uuid.uuid4())self.trace_id = trace_idself.writeLog('watchdog continuation start')reset_redis_expire(TASK_KEY + "privacy_detect", 80)reset_redis_expire(TASK_KEY + "privacy_analysis", 80)reset_redis_expire(TASK_KEY + "privacy_notify", 80)reset_redis_expire(TASK_KEY + "tx_organization", 80)reset_redis_expire(TASK_KEY + "send_message", 80)reset_redis_expire(TASK_KEY + "todo_notify", 80)reset_redis_expire(TASK_KEY + "thirdparty_ex_notify", 80)reset_redis_expire(TASK_KEY + "cookies_scan", 80)reset_redis_expire(TASK_KEY + "xuanwu_app_scan", 80)self.writeLog('watchdog continuation end')def writeLog(self, msg: str):logging.info(f'[{self.trace_id}] {msg}')
import sys
import os
from pathlib import Path
from tasks import CrontabTask# 添加 Django 项目的根目录到 Python 路径
django_project_path = Path(__file__).resolve().parent.parent.parent
sys.path.append(str(django_project_path))
# 设置 DJANGO_SETTINGS_MODULE 环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tencheck.settings')
if __name__ == '__main__':"""总入口 脚本启动信息"""# crontab任务 redis keyredis_key = sys.argv[1]# crontab任务名称task_name = sys.argv[2]# 环境yaml文件env = sys.argv[3]env_name = sys.argv[4]config_name = sys.argv[5]rainbow_key = sys.argv[6]os.environ.setdefault('ENV_NAME', env_name)os.environ.setdefault('CONFIG_NAME', config_name)os.environ.setdefault('RAINBOW_KEY', rainbow_key)task = CrontabTask(env=env, redis_key=redis_key, task_name=task_name)task.start()
from pathlib import Path
import os
import sys
import logging
import time
import traceback
import uuid
import yaml
from django.core.cache import cacheTASK_KEY = "pia:crontab:"class BaseTask:def __init__(self, *args, **kwargs):self.env = kwargs.get('env')self.task_name = kwargs.get('task_name')self.redis_key = kwargs.get('redis_key')self.workspace = Path(__file__).resolve().parent.parent.parentself.config = self.load_config()self.pid = os.getpid()self.trace_id = str(uuid.uuid4())def load_config(self):""" 读取配置文件 """config = {}with open(os.path.join(self.workspace, f"task/conf/config-{self.env}.yaml"), 'r') as f:config = yaml.safe_load(f)return configdef writelog(self, text: str) -> None:""" 记录日志 """log_path = self.config['log_path']formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")file_handler = logging.FileHandler(log_path + "/crontab_task.log") # 日志目录file_handler.setFormatter(formatter)logger = logging.getLogger()logger.addHandler(file_handler)logger.setLevel(logging.DEBUG)text = time.strftime(f'[PID:{self.pid}] ', time.localtime(time.time())) + textlogger.info(f'[{self.trace_id}] ' + text) # 写入日志logger.removeHandler(file_handler)file_handler.close()def script_err_report(push_user: list, info: str) -> None:""" 脚本告警信息 """# writelog(info)passdef start_crontab(self) -> int:"""redis控制脚本执行"""try:redis_key = self.redis_key"""保证原子性 True if lock acquired, False otherwise"""task_status = cache.add(TASK_KEY + redis_key, True, 80)if task_status:self.writelog(f"task set redis key {TASK_KEY + redis_key}")return 0else:self.writelog(f"task redis key {TASK_KEY + redis_key} exists")return 1except Exception:self.writelog(f"redis connect fail {traceback.format_exc()}")def end_crontab(self) -> None:""" 清除redis信息 """try:redis_key = self.redis_keycache.delete(TASK_KEY + redis_key)self.writelog(f"clean redis key {TASK_KEY + redis_key}")except Exception:self.writelog(f"redis connect fail {traceback.format_exc()}")def start(self):start_time = time.time()execute = Falsetry:self.writelog(f"task {self.task_name} start")if self.start_crontab() != 0:error_info = f"task {self.task_name} not finish!"self.writelog(error_info)sys.exit(0)execute = Trueself.do_work()except Exception as e:result_err_info = traceback.format_exc()self.writelog(f"{self.task_name} ERROR: {result_err_info}")# 告警# self.script_err_report(SCRIPT_ERR_REPORT_USER, result_err_info)finally:end_time = time.time()self.writelog(f"{self.task_name} cost time {end_time - start_time}")if execute:self.end_crontab()def do_work(self):""" 脚本核心功能主流程 """# self.writelog("privacy analysis task start")# cmds = [f'cd {WORKSPACE_DIR} && {self.config["privacy_detect"]["python_path"]} manage.py privacy_analysis {self.trace_id}']# retcode = subprocess.call(cmds, shell=True)# self.writelog(f"privacy analysis task end retcode:{retcode}")
import subprocess
from base_task import BaseTaskclass CrontabTask(BaseTask):def do_work(self):config = self.configtask_name = self.task_nameworkspace = self.workspaceself.writelog(f"{task_name} task start")cmds = [f'cd {workspace} && {config["python_path"]} manage.py {task_name} {self.trace_id}']retcode = subprocess.call(cmds, shell=True)self.writelog(f"{task_name} task end retcode:{retcode}")
将任务添加到Linux服务器的 crontab里面
# argv[1]------redis_key ; argv[2]------task_name即 commands目录下 crontab_前缀的文件 ; argv[3]------配置文件 ; argv[4]------环境变量 ; argv[5]------组 ; argv[6]------通道*/1 * * * * cd /usr/local/oit/tencheck && ../env/bin/python3.11 task/script/start_task.py watchdog crontab_watchdog tx xx xx xx >/dev/null 2>&1 &
相关文章:
pyhton django web集群基于linux定时任务
基于django management/commands目录下的脚本 from django.core.management import BaseCommand import logging import uuid from pia.utils.cache import reset_redis_expire from pia.utils.reids_key import TASK_KEYlogging logging.getLogger(task)""" …...
探索 Python 字典的奥秘:Future 对象为何能成为字典的键?
本质在于作为字典的key能不能执行hash(key) 问题 import concurrent.futuresdef task(n):return n * n# 创建一个线程池 with concurrent.futures.ThreadPoolExecutor() as executor:# 提交任务并获取 Future 对象future_to_num {executor.submit(task, i): i for i in rang…...
多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系
在当今快速发展的智慧城市和数字化转型浪潮中,视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能,为用户提供了一个全面、灵活、高效的视频监控解决…...
Spark 中 RDD checkpoint 是通过启动两个独立的 Job 完成的。
在 Spark 中,RDD checkpoint 是通过启动两个独立的 Job 完成的。这两个 Job 分别用于生成 checkpoint 数据和更新依赖关系。下面从源码角度深入分析这个机制。 1. 为什么需要两个 Job? 当调用 RDD.checkpoint() 后: 第一个 Job:…...
如何下载TikTok视频没有水印
随着短视频平台的普及,TikTok(抖音国际版)成为了全球最受欢迎的社交媒体平台之一。它吸引了无数创作者发布自己的短视频内容,内容涵盖了舞蹈、搞笑、挑战、教程、旅行等各个方面。与此用户也常常希望能够下载自己喜欢的TikTok视频…...
天童美语:提升孩子的自信心的方法
每个孩子都渴望展翅高飞,但在成长的旅途中,难免会遇到风雨。不自信,就像一层薄雾,有时悄悄笼罩在孩子心头,阻碍了他们向阳而生的脚步。宁波天童教育认为,身为家长,我们的使命不仅是孩子的庇护伞…...
【网络编程】字节序:大端序和小端序
端序(Endianness),又称字节顺序,又称尾序,在计算机科学领域中,指存储器中或在数字通信链路中,组成多字节的字的字节的排列顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字…...
视频融合×室内定位×数字孪生
随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…...
RK3568平台开发系列讲解(platform虚拟总线驱动篇)注册 platform 驱动
🚀返回专栏总目录 文章目录 一、注册 platform 驱动二、platform_driver 结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 一、注册 platform 驱动 platform_driver_register 函数用于在 Linux 内核中注册一个平台驱动程序。 下面是对该函数的详细介绍: 函数原型…...
Jmeter进阶篇(26)杀掉Tomcat的几种方法
📚Jmeter性能测试大全:Jmeter性能测试大全系列教程❤,这里有你想要的一切,欢迎订阅哦~ 📚前言 Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于部署和运行 Java Web 应用程序。在我们进行压测测试过程中,很可能遇到被测系统崩溃,需要我们来操作一下子Tomcat的情…...
Solana 区块链的技术解析及未来展望 #dapp开发#公链搭建
随着区块链技术的不断发展和应用场景的扩展,性能和可拓展性成为各大公链竞争的关键因素。Solana(SOL)因其高吞吐量、低延迟和低成本的技术特性,在众多区块链项目中脱颖而出,被誉为“以太坊杀手”之一。本文将从技术层面…...
SMO算法-核方法支持向量机
我们现在的问题是要优化目标函数,同时求出参数向量 α \alpha α P m i n ⏟ α 1 2 ∑ i 1 , j 1 m α i α j y i y j K ( x i , x j ) − ∑ i 1 m α i s . t . ∑ i 1 m α i y i 0 0 ≤ α i ≤ C P\underbrace{ min }_{\alpha} \frac{1}{2}\sum\li…...
Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…...
HTTP代理是什么,有什么用?
在互联网的世界里,数据采集已经成为许多企业和个人获取信息的重要手段。而在这个过程中,HTTP代理则是一个不可或缺的工具。那么,HTTP代理究竟是什么?它在数据采集中又有什么用呢?今天,我们就来深入探讨一下…...
Postman之newman
Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有命令行的postman,把写好的测试脚本直接在命令行中运行,newman依赖于node环境,因此,需要先安装好…...
数据库查询表结构和数据量以及占用空间
数据库查询表结构和数据量以及占用空间 数据库查询表结构 mysql SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM INFORMATION_SC…...
android 性能分析工具(03)Android Studio Profiler及常见性能图表解读
说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …...
vscode 执行 vue 命令无效/禁止运行
在cmd使用命令可以创建vue项目但是在vscode上面使用命令却不行 一、问题描述 在 cmd 中已确认vue、node、npm命令可以识别运行,但是在 vscode 编辑器中 vue 命令被禁止,详细报错为:vue : 无法加载文件 D:\Software\nodejs\node_global\vue.…...
C++语言系列-STL容器和算法
C语言系列-STL容器 容器类 本文将对C语言中的标准模板库STL容器进行简单介绍,重点在于如何使用。 容器类 STL中的容器包括以下类别: vector: 动态数组,底层基于数组来实现,在容量不足的时候能够自动进行扩容。list: 链表stack: …...
【Web前端】Promise的使用
Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作,并提供了一种机制来处理该操作最终的成功或失败。具体来说,Promise是由异步函数返回的对象,能够指示该操作当前所处的状态。 当Promise被创建时,它会处于“待定”&a…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
