【定时任务知多少, 横跨10余项目,6种实践方式】

请添加图片描述

工作多年,随着项目的不断研发落地,大大小小做了有10+个项目,其中不少涉及到定时任务。今天来盘一下,这些项目中,定时任务的实现方式 。
通过项目的需求场景,可以看出定时任务需要有什么样的功能。

需求

1 调度需求

  • 任务,增,删,查。
  • 时效,实时发送 / 定时发送。

2 执行需求

  • 分布式,多机计算
  • 跨平台,跨语言

方案

这里列举6个方案 ,上手从简单到难,功能从基础到完备。
1,crontab (native in linux)
2,k8s cronjob (k8s)
3,timeloop (most simple)
4,apSchdule (simple)
5,celery (distribute)
6,airflow (most complete)

使用速览

定时任务在开发和运维中非常常见。这里是六种不同的定时任务框架及其基本使用示例:

1. Crontab (Native in Linux)

介绍: Crontab是Linux系统中用于定时执行任务的工具。它的配置文件crontab可以通过简单的语法来设定任务的执行时间和频率。

使用示例:

  1. 使用如下命令打开crontab编辑器:

    crontab -e
    
  2. 添加一个定时任务,比如每天凌晨2点执行/path/to/script.sh

    0 2 * * * /path/to/script.sh
    

2. Kubernetes CronJob (K8s)

介绍: Kubernetes CronJob用于在Kubernetes集群中创建基于时间调度的任务。它的工作方式类似于Crontab,但具有容器化和分布式的优势。

使用示例:

  1. 创建一个CronJob YAML文件 (cronjob.yaml):

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:name: example-cronjob
    spec:schedule: "0 2 * * *"jobTemplate:spec:template:spec:containers:- name: exampleimage: busyboxargs:- /bin/sh- -c- date; echo Hello from Kubernetes CronJobrestartPolicy: OnFailure
  2. 应用该CronJob:

    kubectl apply -f cronjob.yaml
    

3. Timeloop (Most Simple)

介绍: Timeloop是一个简单的Python库,用于执行定时任务。它特别适合于轻量级的定时任务调度。

使用示例:

  1. 安装Timeloop:

    pip install timeloop
    
  2. 创建一个简单的定时任务:

    from timeloop import Timeloop
    from datetime import timedeltatl = Timeloop()@tl.job(interval=timedelta(seconds=10))
    def sample_job():print("Job executed")if __name__ == "__main__":tl.start(block=True)
    

4. APScheduler (Simple)

介绍: APScheduler是一个轻量级但功能强大的Python库,用于调度定时任务。它支持多种触发器和持久化后端。

使用示例:

  1. 安装APScheduler:

    pip install apscheduler
    
  2. 创建一个定时任务:

    from apscheduler.schedulers.blocking import BlockingSchedulerdef job_function():print("Job executed")scheduler = BlockingScheduler()
    scheduler.add_job(job_function, 'interval', seconds=10)try:scheduler.start()
    except (KeyboardInterrupt, SystemExit):pass
    

5. Celery (Distributed)

介绍: Celery是一个分布式任务队列系统,支持实时处理和定时任务。它适用于需要高并发、分布式任务执行的场景。

使用示例:

  1. 安装Celery:

    pip install celery
    
  2. 创建一个Celery应用并定义定时任务:

    from celery import Celeryapp = Celery('tasks', broker='pyamqp://guest@localhost//')@app.task
    def add(x, y):return x + yfrom celery.schedules import crontabapp.conf.beat_schedule = {'add-every-30-seconds': {'task': 'tasks.add','schedule': 30.0,'args': (16, 16)},
    }if __name__ == '__main__':app.start()

6. Apache Airflow (Most Complete)

介绍: Apache Airflow是一个用于编排和调度复杂工作流的工具,具有丰富的功能和可视化界面。适用于复杂的任务依赖和调度场景。

使用示例:

  1. 安装Airflow:

    pip install apache-airflow
    
  2. 创建一个DAG文件 (example_dag.py):

    from airflow import DAG
    from airflow.operators.python_operator import PythonOperator
    from datetime import datetimedef print_hello():print('Hello from Airflow')default_args = {'owner': 'airflow','depends_on_past': False,'start_date': datetime(2023, 1, 1),'retries': 1,
    }dag = DAG('example_dag', default_args=default_args, schedule_interval='@daily')t1 = PythonOperator(task_id='print_hello',python_callable=print_hello,dag=dag,
    )
  3. 启动Airflow服务并加载DAG:

    airflow webserver
    airflow scheduler
    

以上是六种不同定时任务框架的简要介绍和基本使用示例。我们接下来用表格对比下,

一表对比

名称crontabk8s cronjobapSchedulertimeloopceleryairflow
介绍Linux 原生定时任务调度工具Kubernetes 定时任务调度简单的 Python 调度库最简单的 Python 任务调度工具分布式任务队列功能最完整的工作流调度工具
优点原生Linux等系统支持。灵活 ,好配置。简单易用,如果作为python 小型任务调度器 特别合适。使用最简单。架构天然适合分布式场景。功能最全,实时,延时任务, 分布式,拓扑编排,编程接口,跨语言等。
部署与运营成本简单简单,主要依赖k8s环境简单简单中等偏难,依赖多
缺点功能少,配套不全。扩展功能少。分布式支持弱(需要自己实现基类扩展),语言只能用python。功能很少,适合本地跑 或者 简单demo使用。相对较为原始。很重,很复杂。

选择

几种方案的优缺点很明显,选择困难症患者 也不用纠结。

  • crontab (native in linux):linux老鸟们都懂 ,最原始。物理机上跑一跑。
  • k8s cronjob: cronjob升级版,上云,灵活 ,好配置。用k8s服务的可以配套用。
  • timeloop (most simple):python语言,中小型项目 可选。
  • apschdule (simple) :python语言,中小型项目 可选。
  • celery (distribute ) :一般不单独使用,可以作为中间件。
  • airflow (most complete) :功能最全,最强大, 中大型项目,调用关系复杂,项目结构复杂,拓扑依赖多 可以选用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NOIP2018普及组复赛】题3:摆渡车

题3:摆渡车 【题目描述】 有 n n n名同学要乘坐摆渡车从人大附中前往人民大学,第 i i i位同学在第 t i t_i ti​分钟去等车。只有一辆摆渡车在工作,但摆渡车容量可以视为无限大。摆渡车从人大附中出发、把车上的同学送到人民大学、再回到人…

JavaSE——集合框架二(6/6)-(案例)补充知识:集合的嵌套(需求与分析、问题解决、运行测试)

目录 案例引入 需求与分析 问题解决 运行测试 集合的嵌套 顾名思义,指的是集合中的元素又是一个集合。 本篇通过一个案例对这一知识进行了解: 案例引入 需求与分析 要求在程序中记住如下省份和其对应的城市信息,记录成功后&#xff0…

插件:qrcode的使用

源文档: qrcode文档 安装 npm install --save qrcode TypeScript用户:如果您使用types/qrcode,则需要在数据段上方添加//ts ignore,因为它需要data:string。 用法 用法:qrcode〔options〕<input strin…

【TensorFlow与PyTorch:构建现代深度学习模型的两大支柱】

文章目录 前言TensorFlow与PyTorch的比较神经网络示例:手写数字识别结论 前言 进入深度学习世界的学习者和研究人员很快会遇到两个极具影响力的框架:TensorFlow和PyTorch。它们都提供了强大的工具和库,使得构建和训练复杂的深度学习模型变得…

新书推荐:11.6 调用约定

本节必须掌握的知识点: 函数调用约定 11.6.1 函数调用约定 什么是函数调用约定?就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈,函数怎样命名。当一个程序中所有的函数都是自己实现的&#xf…

介绍谷歌开发工具中的 Application 面板

在现代 Web 开发中,浏览器开发工具(DevTools)是开发者的利器。谷歌 Chrome 的开发者工具提供了丰富的功能,帮助开发者调试、优化和分析他们的 Web 应用程序。本文将深入介绍 DevTools 中的 “Application” 面板,帮助你…

Spark SQL数据源 - Parquet文件

当使用Spark SQL处理Parquet文件时,你可以使用spark.read.parquet()方法从文件系统中加载Parquet数据到一个DataFrame中。Parquet是一种列式存储格式,非常适合用于大数据集,因为它提供了高效的压缩和编码方案。 以下是一个简单的例子&#x…

prometheus的rules配置

说明:本文介绍prometheus中的规则配置; 规则说明 groups:- name: MySQLAlertsrules:- alert: MysqlDownexpr: mysql_up 0for: 0mlabels:severity: criticalannotations:summary: MySQL down (实例:{{ $labels.instance }})description: &q…

VMware Workstation中WinXP联网问题

我一直以为我的虚拟机上的XP没有联网 因为 蒙了半天,发现是因为这个网址打不开,不是没有网 太傻了 不如在cmd命令行中通过ping baidu.com来判断是否联网

JavaScript中对象的增删改查

1. 增(添加属性) let obj {}; // 添加一个属性 obj.name John Doe; // 或者使用方括号语法添加属性(这对于动态属性名很有用) let propName age; obj[propName] 30; console.log(obj); // 输出: { name: John Doe, …

【康耐视国产案例】Nvidia/算能+智能AI相机:用AI驱动 | 降低电动车成本的未来之路

受环保观念影响、政府激励措施推动与新能源技术的发展,消费者对电动汽车(EV)的需求正在不断增长,电动汽车已经成为了未来出行方式的重要组成部分。然而,电动汽车大规模取代燃油汽车的道路还很漫长。最大的障碍就是电动汽车的售价相对过高。尽…

【Python面试50题】

1. **基础概念** 1. Python 是解释型还是编译型语言? 2. 什么是 Python 的 GIL(全局解释器锁)? 3. 如何理解 Python 中的可变与不可变数据类型? 4. 解释一下 Python 中的 pass 语句。 5. Python 中的列…

基于昇腾910B训练万亿参数的语言模型简介

基于昇腾910B训练万亿参数的语言模型 Abstract 在本工作中,作者开发了一个系统,该系统在Ascend 910 AI处理器集群和MindSpore框架上训练了一个万亿参数的语言模型,并提出了一个含有1.085T参数的语言模型,名为PanGu-。 从PanGu-[…

3.基础光照

从宏观上讲渲染包含了两大部分:决定一个像素的可见性,决定一个像素的光照计算 而光照模型就是用于决定在一个像素上决定怎样的渲染光照计算。 一、我们是如何看到这个世界的 1.光源 实时渲染中,我们通常把光源当成一个没有体积的点&#…

远程服务器上,再次配笔记1、2、11、12相同的深度学习和gcc环境

文章目录 参考文献 创建环境在(zgp_m3dm)中安装会显示zgp_m3dm_main环境中的情况满足(base) ~/zgp/M3DM-repetition conda deactivate 再次安装如果服务器本身不能联网,需下载pysocks包以设置反向代理(具体可参考之前的笔记10): 再…

简易版本的QFD质量屋

比如餐馆要考虑什么因素最重要,这里列出好吃,快速,便宜三类问题,然后设置上图的权重, 然后设置9,3,1三类因子,9比如是最重要的,3,1,依次没那么重要…

[vue2项目]vue2+supermap[mapboxgl]+天地图之地图的初始化

Supermap参考教程 天地图 一、安装 1、终端:npm install supermap/vue-iclient-mapboxgl 2、在package.json文件的dependencies查看supermap/vue-iclient-mapboxgl依赖是否安装成功。 3、在mian.js全局引入 import VueiClient from supermap/vue-iclient-mapboxgl; Vue.use(…

stm32和nrf24L01病房呼叫系统的实现

stm32和nrf24L01病房呼叫系统的实现 文章目录 stm32和nrf24L01病房呼叫系统的实现第一章 项目背景与意义第一节 病房呼叫系统的现状1.技术现状2.存在的问题 第二节 STM32F1、nRF24L01、OLED技术介绍1.STM32F1技术介绍2.nRF24L01技术介绍3.OLED技术介绍 第三节 项目目标与预期成…

牛客网刷题 | BC106 K形图案

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

Java 基础面试300题 (201-230)

Java 基础面试300题 &#xff08;201-230&#xff09; 201.下面代码片段的输出是什么&#xff1f; Predicate<Integer> numberChecker (num)–> num > 20; int input 10; System.out.println(input” greater than 20–”numberChecker.test(input)); //Line 1…