济南网站地址/友情链接seo
django-crontab 和 django-cron
有时候需要django在后台不断的执行一个任务,简单的可以通过中间件来实现,但是中间件是根据请求触发的。如果需要定时执行任务,则需要使用到一些插件。
django-crontab 和 django-cron 是常用的用于处理定时任务的插件库,两者区别在于:
- django-cron 完全运行在 django 服务器内部的库,它通过定期检查当前时间与定义的任务计划是否匹配来执行任务。它不依赖于系统级的cron守护进程,而是基于 django 自身的请求周期触发任务检查
- django-crontab 是利用操作系统的 cron 守护进程来调度任务。用户在 django 项目中定义好任务后, django-crontab 会将这些任务写入到系统的 crontab 文件中。当 cron 守护进程执行任务时,实际上会调用 django 管理命令或 url 来执行特定的操作。
django-crontab
使用 django-crontab 需要以下步骤:
- 安装 django-crontab 模块
- 在 settings.py 中注册应用
- 创建定时执行的任务(可以是自定义的函数或自定义的命令)
- 在 settings.py 中配置执行任务
- 执行任务
需要注意的是 django-crontab 只能运行在 linux 环境中,且需要使用到 root 权限。另外需要启动 cron 服务
# 查看 cron 服务状态
service cron status
# 开启 cron 服务
service cron start
# 查看定时任务
crontab -l
# 添加定时任务
crontab -e
安装 django-crontab
pip install django-crontab
注册应用
在 settings.py 中注册 django-crontab 应用
INSTALLED_APPS = [...'django_crontab',
]
创建任务
创建定时执行的任务
创建定时执行函数
在任意 app 下均可创建定时执行函数
# app1/task.pydef scheduleTask(): # 定时执行函数from time import strftime, localtimeprint(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')print("执行了scheduleTask函数")def scheduleTaskWithPara(in_str): # 带参数的定时执行函数import datetimenow_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')print(f"在 {now_time} 执行了定时函数,输入信息{in_str}")
创建定时执行命令
在任意 app 下创建 management 模块(含有 __init__.py
文件),并在此模块下创建 commands 模块。在 commands 模块下创建具体的执行脚本文件。例如:
# app1/management/commands/mycommand1.pyfrom django.core.management.base import BaseCommand, CommandError
from time import strftime, localtimeclass Command(BaseCommand):help = '这是第一个command测试指令'# 为handle中添加参数解析,def add_arguments(self, parser):parser.add_argument('-p', # 设置参数的时候 前边携带'--param',action='store',dest='param', # 自定义传入的参数键名ssdefault='close', # 默认的键值help='name of author.',)def handle(self, *args, **options):# print("mycommand1----开始")'''添加你需要功能,(访问数据库,判断有效性等等)...'''# 例如try:if options['param']:print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')print(": mycommand1传入的参数为", options['param'])except Exception as e:print("12",e)print(CommandError("1111111111111111111111111"))# print("mycommand1----结束")
# app1/management/commands/mycommand2.pyfrom django.core.management.base import BaseCommand
from time import strftime, localtimeclass Command(BaseCommand):help = '这是第二个command测试指令'# 为handle中添加参数解析,def add_arguments(self, parser):parser.add_argument('-p', # 设置参数的时候 前边携带'--param',action='store',dest='param', # 自定义传入的参数键名ssdefault='close', # 默认的键值help='name of author.',)def handle(self, *args, **options):# print("mycommand2----开始")'''添加你需要功能,(访问数据库,判断有效性等等)...'''# 例如if options['param']:print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')print("mycommand2传入的参数为", options['param'])# print("mycommand2----结束")
配置任务
将创建好的定时执行任务配置到 settings.py 中去,以方便执行
配置定时执行函数
在 CRONJOBS 列表中添加一个元组,第一个元素是执行间隔时间,第二个元素是执行任务函数。如没有参数第三个元素是输出处理,如有参数第三、四元素分别为传参,第五参数是输出处理。例如:
CRONJOBS = [# 每1分钟执行scheduleTask函数,并将执行中的返回的内容全部打印到crontab.log文件中('*/1 * * * *', 'app1.tasks.scheduleTask', '>> /tmp/crontab.log'),('*/1 * * * *', 'app1.tasks.scheduleTaskWithPara', ['James'], {}, '>> /tmp/crontab.log'),
]
配置定时执行命令
类似于定时执行函数,将定时执行命令添加到 CRONJOBS 列表中去。区别在于元组的元素定义不同
CRONJOBS = [# 每1分钟执行django的自定义命令,并将执行中的返回的内容全部打印到crontab.log文件中('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {"param": "mycommand1_test"}, '>>/home/wangzhipeng/myproject/crontab.log'),('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {"param": "mycommand2_test"}, '>>/home/wangzhipeng/myproject/crontab.log')
]
- 元素1:定时 例如*/1 * * * * 表示每隔1分钟执行
- 元素2:方法的python模块路径,如果执行django-admin命令,则写django.core.management.call_command
- 元素3:方法的位置参数列表(默认值:[]),如果执行django-admin命令,则填写所需执行的命令
- 元素4:方法的关键字参数的dict(默认值:{})
- 元素5:执行log存放位置(即重定向到文件,默认:‘’)
配置完成后可以进行测试:
python manage.py mycommand1 -p 123
# 2019-05-10 15:10:59: mycommand1传入的参数为 123
关于 linux 的 crontab 时间语法
crontab 的时间语法由五部分组成,通常为五个 *
,每一位表示的意思分别为:分钟、小时、日、月、星期。
可使用的字符和其意义为:
字符 | 含义 |
---|---|
* | 代表所有取值范围的数字 |
/ | 代表“每”的意思,例如 */5 表示5个单位 |
- | 代表从某个数字到某个数字 |
, | 分隔离散的数字 |
例如:
示例 | 含义 |
---|---|
0 */2 * * * | 每2个小时 |
0 23-7,9 * * * | 23点到7点,或9点 |
0 11 4 * 1-3 | 每月4号或周一到三的11点 |
0 4 1 1 * | 1月1日4点 |
0 6 * * * | 每天6点 |
0 */2 * * * | 每2小时 |
执行任务
添加并开启定时任务:
python manage.py crontab add
查看执行中的定时任务
python manage.py crontab show
删除(停止)定时任务
python manage.py crontab remove
django-cron
django-cron 因为完全基于 django,使得使用简单。但是也是这个原因,要想使定时任务生效,django服务必须一直处于运行状态。
另外 django-cron django-cron会依赖于HTTP请求来触发其内部的任务检查逻辑(通过中间件实现)。这意味着只有当有用户访问网站或通过其他方式触发HTTP请求时,cron任务才可能被执行。
需注意的是,dnango-cron 也只能在 linux 系统上运行。
(django-cron英文文档)[https://django-cron.readthedocs.io/en/latest/]
使用 django-cron 需要以下步骤:
- 安装 django-cron 模块
- 在 settings.py 中注册应用
- 进行迁移,创建 django_cron 应用所需资源
- 创建定时执行的任务类
- 在 settings.py 中配置执行任务
安装 django-cron
pip install django-cron
注册应用
在 settings.py 中注册应用:
INSTALLED_APPS = [# ..."django_cron",
]
创建 django_cron 资源
python manage.py migrate django_cron
创建任务类
和 django-crontab 不同的是, django-cron 的定时任务是一个集成自 django_cron.CronJobBase
的类
# app1/cron.py
from django_cron import CronJobBase, Schedule
from django.core.management import call_commandclass MyCronJob(CronJobBase):RUN_EVERY_MINS = 30 # 每30分钟运行一次schedule = Schedule(run_every_mins=RUN_EVERY_MINS) # 添加任务执行周期code = 'yourapp.my_cron_job' # 唯一标识符def do(self):# 执行的命令或函数call_command('your_management_command') # 如果是管理命令# 或执行任意Python代码my_function()
如果需要在指定时间执行任务,而不是按周期执行,则使用schedule = Schedule(run_at_times=['11:30', '14:00', '23:15'])
,注意必须使用24小时制。按照周期执行和执行时间执行可以一起使用。schedule = Schedule(run_every_mins=RUN_EVERY_MINS, run_at_times=RUN_AT_TIMES)
。
配置任务
需要在 settings.py 中的 CRON_CLASSES 列表中注册此任务
CRON_CLASSES = ["app1.cron.MyCronJob",
]
执行任务
在 django-cron 中,定时任务是在 django 应用运行时触发执行的。如果需要立即运行所有的 cron 任务,例如部署新代码后或进行测试时,可以手动执行任务。
python manage.py runcrons
也可以单独指定手动执行具体的哪个任务类
python manage.py runcrons "app1.cron.MyCronJob" "app1.cron.OtherCronJob"
如果需要静默执行,即不输出相关信息,可以添加参数 --silent
。
如果需要强制执行,可以添加参数 --force
。
如果需要查看有哪些任务可以执行,而并不真的运行这些任务,可以添加参数 --dry-run
。
django-apscheduler
cron 是基于 unix_like 系统的,windows 下使用 APScheduler。APscheduler全称Advanced Python Scheduler,它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时,它还支持异步执行、后台执行调度任务。
django-apscheduler 是 APScheduler 的django定制封装插件版,专为 django 设计。它的使用流程为:
- 安装
- 注册应用
- 配置
- 执行迁移
- 创建任务
- 初始化调度器,并添加任务
- 启动任务
apscheduler英文文档
参考文档:定时任务框架APScheduler学习
安装
pip install django-apscheduler
注册应用
在 settings.py 中注册 app
INSTALLED_APPS = [# ...'django_apscheduler',
]
执行迁移
python manage.py migrate
APScheduler 会在数据库中创建2张表
- django_apscheduler_djangojob : 用于存储定时任务
- django_apscheduler_djangojobexecution : 用于存储每次的执行记录、时长和执行结果等。
创建任务
apscheduler 的任务就是普通的函数,可以将需要执行的内容写在函数内部,然后使用调度器添加任务即可
def scheduler_task():pass # 这里是任务需要执行的内容
创建调度器,添加任务
django_apscheduler 是基于 APScheduler 使用的,安装了 django_apscheduler 会自动安装 APScheduler。调度器需要使用 apscheduler.schedulers.backgroud.BackgroundScheduler
或 apscheduler.schedulers.blocking.BlockingScheduler
两个类中的一个来实例化调度器。两者区别在于 BackgroundScheduler
会在后台执行,而 BlockingScheduler
会在主线程执行,进而阻塞主线程。因此常用 BackgroundScheduler
来创建调度器。
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_eventsdef init_scheduler():scheduler = BackgroundScheduler() # 创建调度器try:scheduler.add_jobstore(DjangoJobStore(), 'default') # 添加调度器作业存储# 添加定时任务,每天0点,30分执行一次,任务id为test。scheduler.add_job(scheduler_test, 'cron', hour=0, minute=30, id='test', replace_existing=True) # 添加定时任务,间隔3秒执行一次scheduler.add_job(scheduler_jog, 'interval', seconds=3, id='3_second_job')# 用装饰器的方式添加任务@regist_job(scheduler, "interval", seconds=10, replace_existing=True, id="task_per_10s")def task_per_10_seconds():print('间隔10秒执行任务')# 注册处理事件register_events(scheduler)# 调度器开始工作,计时器开始计时scheduler.start() except Exception as e:print(e)# 报错则调度器终止运行,否则会跳过错误任务继续执行scheduler.shutdown()
scheduler.add_job(func, trigger=None, args=None, kwargs=None, id=None, name=None, misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, next_run_time=undefined, jobstore='default', executor='default', replace_existing=False, **trigger_args)
方法可以将任务添加至调度器,其参数有:
- func 必须参数,需要执行的任务函数(或可调用对象)
- trigger 必须参数,定时器类型,可以是触发器实例或触发器字符串
- args 和 kwargs:传递给任务函数的参数列表和关键字参数字典。主要用于trigger使用字符串时,传递具体的定时时间。
- id 和 name:分别用于唯一标识和命名一个任务。如果未提供,将自动生成。
- misfire_grace_time:任务错过执行的时间窗口,在这个时间段内,即使错过了计划执行时间点,也会被执行。
- coalesce:布尔值,表示当任务被错过多次后是否合并执行(只执行一次而不是多次)。
- max_instances:同一时间内允许的最大并发执行实例数。
- next_run_time:手动指定下一次运行时间(通常由调度器自动计算)。
- jobstore:指定存储此任务的作业存储。通常配置为 ‘default’ 或 DjangoJobStore 的实例,且在
add_job
之前使用add_jobstore
方法配置。 - executor:执行器实例,负责实际执行作业。默认使用已配置好的执行器。
- replace_existing:是否替换同名或同ID的任务,解决第二次调度任务时因为第一次任务未完成而报错的问题
APScheduler 支持的定时器主要有:
定时器 | 说明 |
---|---|
cron | 基于 unix_like 系统的 cron 定时任务 |
interval | 重复定时器 |
date | 固定时间定时器 |
scheduler.add_job()
添加定时器时,可以在第二个参数以字符串形式指定定时器类型,然后使用关键字传参的方式传入具体时间,也可以使用apscheduler.triggers.cron.CronTrigger
、apscheduler.triggers.interval.IntervalTrigger
或 apscheduler.triggers.date.DateTrigger
创建定时器对象实例传入第二个参数(或用关键字传参传给trigger
)。
cron 定时器:
interval 定时器:
date 定时器
启动任务
在 django 中执行调度器即可开始定时任务,网上很多推荐添加到 urls.py 中执行。如果定时器中需要涉及 django 资源,例如需要使用 app 的 models 来操作数据库,则需要相应资源加载完成。这里推荐写到 app 的 apps.py 中,在设置类的 ready()
方法中,可以在 app 准备完成时执行。
# app1/apps.py
from django.apps import AppConfigclass App1Config(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'app1'def ready(self):super().ready()run_once = os.environ.get('CMDLINE_DJANGO_RUNNER_RUN_ONCE')if run_once is not None:returnos.environ['CMDLINE_DJANGO_RUNNER_RUN_ONCE'] = 'True'# 在这里执行 APScheduler 定时任务
需要注意的是,启动任务前必须完成迁移工作,否则 django_apscheduler 会因数据库中没有创建2张表而报错。
另外 django 默认 runserver 时会创建一个守护进程来监控代码有没有改变以计时重启服务,这在调试时是非常方便的,但是定时任务也会重复执行。所以启用执行任务时需使用 python manage.py runserver --noreload
,或在环境变量(不能在django服务中,因为django进程间数据隔离)添加一个状态量,作为锁使用,防止重复执行。
其他
scheduler 对象还有一些常用方法:
scheduler.remove_job(job_id)
删除任务scheduler.pause_job(job_id)
暂停任务scheduler.resume_job(job_id)
继续执行暂停任务scheduler.modify_job(job_id)
修改定时任务(可以修改除了id外的属性,例如定时器等参数)scheduler.get_jobs()
获取所有定时任务scheduler.get_job(job_id)
获取特定任务scheduler.print_jobs()
打印格式化的任务列表
相关文章:

自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler
django-crontab 和 django-cron 有时候需要django在后台不断的执行一个任务,简单的可以通过中间件来实现,但是中间件是根据请求触发的。如果需要定时执行任务,则需要使用到一些插件。 django-crontab 和 django-cron 是常用的用于处理定时任…...

医院挂号预约|医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
医院挂号预约小程序目录 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 &…...

网络选择流程分析(首选网络类型切换流程)
首先是界面,我在此平台的界面如下: 对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异 然后点击切换按钮会调用到UniEnabledNetworkModePreferenceControlle…...

AutoSAR(基础入门篇)6.1-Vector的汽车电子开发工具链简介
目录 前言 一、PREEvision 二、vVIRTUALtarget 三、DaVinci 四、CANoe 五、CANape 其他 前言 因为国内用...

TI的电量计驱动在卸载时导致Linux卡死
背景 最近移植TI电量计芯片bq40z50的驱动,移植完毕后,能正常读取电池信息了,但是无意中发现驱动卸载会导致Linux卡死,死前终端闪过大量打印,将putty的缓冲区都耗尽了,必须启用syslog转发并用visual syslog…...

使用yolo训练自己的模型
YOLO(You Only Look Once)是一种用于目标检测的深度学习模型,旨在实时检测图像或视频中的多个对象。与传统的目标检测方法不同,YOLO一次性处理整个图像,而不是通过滑动窗口或区域提议进行多次检测。这种方法使得YOLO在…...

堆的概念实现
前言 本文将详细讲解堆。堆是一种二叉树(一般是完全二叉树)使用顺序结构的数组来存储。 tip:这里我们需要注意区分堆在不同地方的含义,这里的堆是一个数据结构,操作系统虚拟进程地址空间的堆是操作系统中管理内存的一块…...

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展
转自 极客时间 Redis主从架构 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …...

pnpm + vite 从外网迁移到内网环境开发
离线安装pnpm 在有外网的机器上执行以下命令,下载pnpm的tgz压缩包至桌面,注意下载版本和当前使用版本保持一致 npm pack -g pnpm7.4.0 --pack-destination ~/Desktop将tgz压缩包拷贝至离线机器在离线机器中执行命令 npm -g i /home/user/offline/pnpm…...

寒假作业7
sql语句 创建表格 create table 表名 (字段名 数据类型,字段名 数据类型) create table if not exists 表名 (字段名 数据类型, 字段名 数据类型) 删除表格 drop table 表名; 插入记录 全字…...

【0257】关于pg内核shared cache invalidation messages (概念篇)
文章目录 1. inval messages2. 可配置参数(Configurable parameters)1. inval messages 所谓“共享缓存无效消息(shared cache invalidation messages)”,从概念上讲,共享缓存无效消息存储在一个无限数组中,其中maxMsgNum是存储提交消息的下一个数组下标, minMsgNum是…...

Nginx 缓存集成、清除、设置不缓存资源
文章目录 前言1. web缓存服务1.1 原理1.2 指令1.2.1 proxy_cache_path1.2.2 proxy_cache1.2.3 proxy_cache_key1.2.4 proxy_cache_valid1.2.5 proxy_cache_min_uses1.2.6 proxy_cache_methods 2. 缓存案例3. 缓存的清除3.1 删除对应的缓存目录3.2 使用第三方扩展模块ngx_cache_…...

C++面试宝典第27题:完全平方数之和
题目 给定正整数 n,找到若干个完全平方数(比如:1、4、9、16、...),使得它们的和等于n。你需要让组成和的完全平方数的个数最少。 示例1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4。 示例2: 输入:n = 13 输出:2 解释:13 = 4 + 9。 解析 这道题主要考察应聘者对于…...

webrtc native api的几个要点
文章目录 基本流程状态回调类sdp的中媒体行pc对象 基本流程 webrtc native的接口,主要就是围绕着PeerConnection对象,一个PeerConnection对象它代表了一次音视频会话。 那么通过PeerConnection对象建立音视频通话,包括如下步骤: …...

MinMaxScaler, StandardScaler数据预处理中常用的两种缩放方法,用于将数据标准化或归一化到特定的范围或分布
MinMaxScaler 和 StandardScaler 是数据预处理中常用的两种缩放方法,用于将数据标准化或归一化到特定的范围或分布。这两种缩放方法的主要区别在于它们的目标和实现方式。 MinMaxScaler MinMaxScaler 会将数据缩放到一个指定的范围,通常是 [0, 1] 或 […...

【Web】vulhub Shiro-550反序列化漏洞复现学习笔记
目录 Shiro简介 复现流程 工具一把梭 半脚本半手动 原理分析 反序列化入口 常见的key 登录过程 验证过程 利用原理 Shiro简介 Apache Shiro 是一个强大且易于使用的 Java 安全框架,用于身份验证、授权、加密和会话管理等安全功能。Shiro 的设计目标是简单…...

【论文精读】多模态情感分析 —— VLP-MABSA
Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis 本篇论文发表于ACL-2022 原文链接 https://arxiv.org/abs/2204.07955 源码 GitHub - NUSTM/VLP-MABSA 模态:图像文本 基于多模态方面的情感分析(MABSA)近年来越来越受到关注。然而&am…...

SQL SELECT TOP, LIMIT, ROWNUM 子句
在数据库中,LIMIT是一个用于限制结果集的关键字,它可以与SELECT语句一起使用。它有以下几种用法: LIMIT n:返回前n条记录。例如,LIMIT 10将返回结果集中的前10条记录。 LIMIT m, n:返回从第m1条记录开始的…...

金融信贷风控评分卡模型
评分卡模型概念 评分模型是根据借款人的历史数据,选取不同维度的数据类型,通过计算而得出的对借款人信用情况打分的模型。不同等级的信用分数代表了借款人信用情况的好坏,以此来分析借款人按时还款的可能性。 评分卡模型分类 A卡ÿ…...

【java苍穹外卖项目实战二】苍穹外卖环境搭建
文章目录 1、前端环境搭建2、后端环境搭建1、项目结构搭建2、Git版本控制3、数据库创建 开发环境搭建主要包含前端环境和后端环境两部分。 前端的页面我们只需要导入资料中的nginx, 前端页面的代码我们只需要能看懂即可。 1、前端环境搭建 前端运行环境的nginx&am…...

在 Ubuntu 22.04 上安装 Django Web 框架的方法
简介 Django 是一个功能齐全的 Python Web 框架,用于开发动态网站和应用程序。使用 Django,您可以快速创建 Python Web 应用程序,并依赖框架来完成大部分繁重的工作。 在本指南中,您将在 Ubuntu 22.04 服务器上启动 Django。安装…...

JVM Java虚拟机入门指南
文章目录 为什么学习JVMJVM的执行流程JVM的组成部分类加载运行时数据区本地方法接口执行引擎 垃圾回收什么样的对象是垃圾呢内存溢出和内存泄漏定位垃圾的方法对象的finalization机制垃圾回收算法分代回收垃圾回收器 JVM调优参数JVM调优工具Java内存泄漏排查思路CPU飙高排查方案…...

【错误文档】This与Here的区别、主系表结构、如何合并两个句子、祈使句结构
目录 This与Here的区别 主系表结构 如何合并两个句子 祈使句结构 原句中文1: “就是这件。” 我的翻译: This is it. 正确翻译: 书上原句: Here it is! 正确解释: 两个翻译都对,只是强调点不同&…...

Java入门之JavaSe(韩顺平p1-p?)
学习背景: 本科搞过一段ACM、研究生搞了一篇B会后,本人在研二要学Java找工作啦~~(宇宙尽头是Java?)爪洼纯小白入门,C只会STL、python只会基础Pytorch、golang参与了一个Web后端项目,可以说项目小…...

TCP的连接和断开详解
目录 1.TCP基础知识 1.1.TCP 头格式 1.2.TCP协议介绍 1.3.UDP协议介绍 1.4.TCP 和 UDP 区别 1.5.TCP 和 UDP 应用场景 1.6.计算机网络相关术语(缩写) 2.TCP 连接建立:三次握手 2.1.TCP 三次握手过程 2.2.三次握手原理 2.3.异常分析…...

armbian ddns
参考https://mp.weixin.qq.com/s/0Uu_nbGH_W6vAYHPH4kHqg Releases jeessy2/ddns-go GitHub mkdir -p /usr/local/ddns-go cd /usr/local/ddns-gowget https://github.com/jeessy2/ddns-go/releases/download/v6.1.1/ddns-go_6.1.1_freebsd_armv7.tar.gztar zxvf ddns-go_…...

MQTT 服务器(emqx)搭建及使用
推荐阅读: MQTT 服务器(emqx)搭建及使用 - 哔哩哔哩 (bilibili.com) 一、EMQX 服务器搭建 1、下载EMQX https://www.emqx.com/zh/try?productbroker 官方中文手册: EMQX Docs 2、安装使用 1、该软件为绿色免安装版本,解压缩后即安装完…...

【flink状态管理(四)】MemoryStateBackend的实现
文章目录 1.基于MemoryStateBackend创建KeyedStateBackend1.1. 状态初始化1.2. 创建状态 2. 基于MemoryStateBackend创建OperatorStateBackend3.基于MemoryStateBackend创建CheckpointStorage 在Flink中,默认的StateBackend实现为MemoryStateBackend,本文…...

前端架构: 脚手架在前端研发流程中的意义
关于脚手架 脚手架又被成为 CLI (command-line interface)基于文本界面,通过中断输入命令执行常见的脚手架:npm, webpack-cli, vue-cli拿 npm 这个脚手架来说 在终端当中输入 npm 命令, 系统就会通过文本方式返回 npm 的使用方法它这种通过命令行执行的…...

Qt网络编程-QTcpServer的封装
简单封装Tcp服务器类,将QTcpServer移入线程 头文件: #ifndef TCPSERVER_H #define TCPSERVER_H#include <QObject>class QTcpSocket; class QTcpServer; class QThread; class TcpServer : public QObject {Q_OBJECT public:explicit TcpServer(…...