Python Celery动态添加定时任务生产实践指南

Python Celery动态添加定时任务生产实践指南

什么是Celery

Celery 是一个基于 Python 实现的分布式任务队列,用于处理大量的异步任务。Celery 可以让你的应用程序分布式地运行,而不必担心每个任务在哪台机器上运行。Celery 提供了简单易用的 API,可以让我们将代码实现成一个异步任务,并且能够在多个 worker 中执行,支持同时处理数以百万计的任务。

安装Celery

安装Celery可以使用pip直接安装,具体步骤如下:

pip install celery

编写Celery任务

编写一个Celery任务非常简单,只需要以下步骤:

  1. 定义一个函数,将它装饰为 @app.task
from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y
  1. 启动 Celery worker
celery -A tasks worker --loglevel=info

Celery动态添加定时任务

我们可以使用 celery beat 来动态添加定时任务。celery beat 是 Celery 提供的一个定时任务调度程序,它可以帮助我们在指定的时间运行任务。

以下是一个简单示例,定时每分钟打印一段文字。

from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def print_hello():
    print("Hello, world!")

app.conf.beat_schedule = {
    'print-hello-every-minute': {
        'task': 'tasks.print_hello',
        'schedule': crontab(),
    },
}

上面的代码中,我们定义了一个 print_hello 的任务,并将它安排到每分钟运行一次。这个任务会输出 "Hello, world!"。

接下来,我们需要启动 Celery worker 和 celery beat:

# 启动 celery worker
celery -A tasks worker --loglevel=info

# 启动 celery beat
celery -A tasks beat --loglevel=info

然后就可以每分钟看到一次 "Hello, world!" 了。

Celery动态添加定时任务生产实践

在生产环境中,我们需要动态地添加、删除、修改定时任务。以下是一个示例,演示如何使用 Django 中的模型动态添加定时任务。

  1. 创建一个 Django app,命名为 mytasks

  2. mytasks/models.py 中定义一个 Task 模型:

from django.db import models

class Task(models.Model):
    name = models.CharField(max_length=255)
    task = models.CharField(max_length=255)
    schedule = models.CharField(max_length=255)
  1. mytasks/tasks.py 文件中编写任务代码:
from celery import Celery
from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)

app = Celery('mytasks', broker='pyamqp://guest@localhost//')

@app.task
def run_task(task_id):
    try:
        task = Task.objects.get(id=task_id)
        logger.info('[%s] start' % task.name)
        # 执行任务代码
        logger.info('[%s] finish' % task.name)
    except Task.DoesNotExist:
        logger.error('Task does not exist')

这个任务会从数据库中查找之前创建的 Task 实例,执行任务代码,然后记录日志。

  1. mytasks/__init__.py 中添加以下代码:
from mytasks.tasks import app as celery_app

__all__ = ['celery_app']

这么做是为了让 django 通过这个 app 自动发现我们的任务代码。

  1. 修改 settings.py,添加以下配置:
INSTALLED_APPS = [
    # 其他app
    'mytasks',
]

CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

CELERY_BEAT_SCHEDULE = {
    'run-task-once-a-minute': {
        'task': 'mytasks.tasks.run_task',
        'schedule': crontab(minute='*/1'),
        'args': (1, ),
    },
}

这里,我们指定了 CELERY_BEAT_SCHEDULER,告诉 Celery 要使用 Django 的数据库来管理定时任务。

使用 CELERY_BEAT_SCHEDULE,我们可以定义每个 Task 的定时配置,任务执行时需要的参数,等等。

  1. 在 Django shell 中创建一个任务:
from mytasks.models import Task
from celery.schedules import crontab

task = Task.objects.create(name='Task 1', task='mytasks.tasks.run_task', schedule=crontab(minute='*/2'))

创建一个名为 "Task 1" 的任务,定时每两分钟执行。

  1. 启动 Celery worker 和 celery beat:
# 启动 celery worker
celery -A mysite worker --loglevel=info

# 启动 celery beat
celery -A mysite beat --loglevel=info
  1. 执行 run_task,我们将在启动一分钟后看到日志。

到这里,我们就演示了如何使用 Django 中的模型动态添加定时任务,以及如何使用Celery调度器来执行这些任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Celery动态添加定时任务生产实践指南 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • django-crontab 定时执行任务方法的实现

    让我来详细讲解一下“django-crontab 定时执行任务方法的实现”的完整攻略。 什么是django-crontab django-crontab是一款基于Django框架的轻量级Python库,它通过Python的定时任务模块,为我们提供了一种定时执行任务的方法,可以设置Django的管理脚本定期运行。 django-crontab的安装 首先,我们…

    人工智能概览 2023年5月25日
    00
  • 使用Dropzone.js上传的示例代码

    下面是使用Dropzone.js上传的示例代码的完整攻略: 第一步:引入Dropzone.js插件 首先,你需要下载Dropzone.js,并在HTML文件中引入相关的JS和CSS文件。在你的HTML头部中添加以下代码: <link rel="stylesheet" href="https://cdnjs.cloudfla…

    人工智能概论 2023年5月25日
    00
  • Pytorch数据读取与预处理该如何实现

    PyTorch是一个强大的深度学习框架,提供了许多方便的工具来处理大型数据集和创建机器学习模型。在这里,我们将讲解如何使用PyTorch来实现数据读取和预处理。 PyTorch数据读取与预处理攻略 PyTorch数据读取 在我们开始之前,假设我们有一个文件夹,其中包含许多图像(png或jpg格式),这是我们希望用于我们的深度学习模型的数据集。现在我们需要使用…

    人工智能概论 2023年5月25日
    00
  • 使用python进行图片的文字识别详细代码

    下面是使用 Python 进行图片的文字识别的完整攻略。 简介 文字识别(OCR,Optical Character Recognition)是一项将图片中的文字转化为计算机可处理的文本的技术。在信息处理、自动文档分类、数据挖掘等领域都有广泛的应用。目前,OCR 技术已经相当成熟,并且在商用软件中得到了广泛的应用,有很多免费或开源的 OCR 库供大家使用,比…

    人工智能概论 2023年5月25日
    00
  • Django Auth应用实现用户身份认证

    下面是详细讲解“Django Auth应用实现用户身份认证”的完整攻略。 1. 安装 Django Auth 首先,需要安装 Django Auth 库。可以使用 pip 命令进行安装: pip install django-auth 2. 创建用户模型 在 models.py 中定义一个 User 模型,用于保存用户的基本信息。这个模型需要继承 Djang…

    人工智能概览 2023年5月25日
    00
  • Springboot基于assembly的服务化打包方案及spring boot部署方式

    Spring Boot是一种快速开发应用程序的框架,它的优点在于它有着可扩展的安装选项。使用Maven或Gradle构建应用程序时,可以将Spring Boot应用程序打包为JAR文件以便快速部署。使用Spring Boot打包服务,我们可以做到移植性以及快速安装。 Spring Boot基于assembly的服务化打包方案 使用Spring Boot通过m…

    人工智能概览 2023年5月25日
    00
  • 在表单提交前进行验证的几种方式整理

    以下是在表单提交前进行验证的几种方式整理: 1. 客户端验证 客户端验证是一种通过JavaScript在客户端对表单进行校验的方式。使用此方式可以给用户提供实时反馈。使用客户端验证的弊端是,由于每个浏览器都有自己的JavaScript引擎,因此需要在不同浏览器上进行测试,并且JavaScript可以被禁用,导致验证无效。 以下是一个使用jQuery实现的客户…

    人工智能概论 2023年5月25日
    00
  • Python3数字求和的实例

    Python3数字求和的实例是一个非常简单的程序,但它很好地展示了Python语言的一些关键特性。下面我来详细讲解这个程序的实现方法: 程序的实现方法 我们将使用Python解释器来运行这个程序,主要有以下两个步骤: 打开Python解释器:许多操作系统都已经默认安装了Python解释器,输入python3并按下回车键即可打开它。 编写Python代码:使用…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部