首页 > 其他分享 >【定时任务知多少, 横跨10余项目,6种实践方式】

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

时间:2024-06-01 23:33:08浏览次数:32  
标签:__ 10 airflow 示例 知多少 任务 横跨 import 定时

请添加图片描述

工作多年,随着项目的不断研发落地,大大小小做了有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: example
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from Kubernetes CronJob
              restartPolicy: 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 timedelta
    
    tl = 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 BlockingScheduler
    
    def 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 Celery
    
    app = Celery('tasks', broker='pyamqp://guest@localhost//')
    
    @app.task
    def add(x, y):
        return x + y
    
    from celery.schedules import crontab
    
    app.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 datetime
    
    def 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) :功能最全,最强大, 中大型项目,调用关系复杂,项目结构复杂,拓扑依赖多 可以选用。

标签:__,10,airflow,示例,知多少,任务,横跨,import,定时
From: https://blog.csdn.net/qq_38428433/article/details/139381470

相关文章

  • AS-V1000视频监控接入平台:通过SDK接入宇视NVR及对应的网路摄像机(通道)
    目录一、AS-V1000视频监控平台介绍1、概述2、视频接入能力介绍3、功能介绍二、使用宇视的SDK接入宇视NVR1、添加宇视SDK设备类型(类型:宇视NVR)2、NVR的SDK设置​3、管理平台接入(1)添加设备入口(2)添加设备信息(3)添加NVR设备成功(4)设备能力4、添加通道三、接入后的用户和......
  • 拯救win10钉子户:微软win12五大全新功能大猜想
    对于大部分电脑用户而言,微软的Windows一直是一个绕不过去的话题。虽然微软早在2021年就已经推出了Win11,但是依旧还是有不少人依旧“钉”在了Windows10上,拒绝更新。虽然微软的Build2024开发者大会已经结束,今年依旧没有提到Windows12的消息。由于公司不断尝试将AI推向Windows......
  • 某讯tz103s_v1.4改串、开adb、去控
    方案记录如下,使用后果自负!如果有人0.9都逃费,甚至拿出去倒卖的话,我只能说...格局小了!提前说明:这款棒子频段不全且为板载wifi天线,不推荐作为主力使用,但没有限速、微信直充、套餐真香~这里介绍的是不需要编程器的玩法改串:先登录,访问这个链接,进入工厂模式。打开AT端口,不出意料电......
  • 反转21克msvcr100.dll丢失怎么办?反转21克msvcr100.dll丢失问题的全面解析与解决之道
    《反转21克》是目前第一款以科幻为题材的互动影像作品。然而很多玩家都遇到了反转21克msvcr100.dll丢失的问题,其中msvcr100.dll是MicrosoftVisualC++2010RedistributablePackage的一部分,它提供了运行时库支持,下面一起来看看解决方法介绍吧!重新安装相关程序重新安装与ms......
  • EG2106 原装正品 贴片SOP-8 大功率MOS管栅极驱动芯片耐压600V
    EG2106在电机控制中的应用非常广泛,下面是一些典型的应用案例: 1.无刷直流电机(BLDC)控制:EG2106可以用于驱动无刷直流电机的功率MOSFET或IGBT。在无刷电机控制器中,通常会用到H桥电路来控制电机的正反转和转速,EG2106的高电压和大电流能力使其非常适合这种应用。 2.步进电......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)IEC61131-3编程语言的的中间格式,可以带来一系列显著的优点,以下......
  • WebAssembly作为PLC(可编程逻辑控制器)引擎技术的10大优势
    WebAssembly(简称Wasm)是一种用于在现代Web浏览器中安全执行低级代码的二进制指令格式。它被设计为一种与语言无关的目标格式,这意味着可以用任何编程语言编写代码,然后编译成Wasm。将WebAssembly作为PLC(可编程逻辑控制器)的中间格式,可以带来一系列显著的优点,以下是一些主要的亮点:性......
  • NOIP2024模拟赛10:热烈张扬
    NOIP2024模拟赛10:热烈张扬T1一句话题意:给定一颗树和两个玩家的起点\(a,b\)和各自的移动速度\(da,db\).问:如果二人均以最优策略移动,问最后谁是赢家(先走到对方当前位置)标签:LCA,思维,博弈不妨设\(a\)是速度快的,\(b\)是速度慢的。结论一:若二者初始距离\(\le\)先手......
  • 力扣刷題---回文數 擊敗100%用戶的解法
    題目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:从左向右读,为-121。从右......
  • 学习前端的知识总结10
    CSS浮动网页布局方式有以下五种:标准流(普通流、文档流)︰网页按照元素的书写顺序依次排列浮动定位Flexbox和Grid(自适应布局)标准流是由块级元素和行内元素按照默认规定的方式来排列,块级就是占一行,行内元素一行放好多个元素。1.浮动浮动最典型的应用:可以让多个块级元素一行......