django+celery+beat笔记

celery用于异步执行任务,定时任务等。

主要角色:

        beat: 定时任务轮询。

        worker:任务处理者。

        broker:任务收集

        backend: 结果收集

异步执行celery

构建项目

首先你得运行一个django程序:

在settings同级文件下面,创建celery.py:

import os
from celery import Celery

# 添加环境,找到django的配置文件,myproject是目录层级的名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
# 创建celery
app = Celery('async_task')
# 从django配置文件里面,使用同一个配置文件,namespace会读取celery开头的。
app.config_from_object('django.conf:settings', namespace='CELERY')

同级目录下编辑 __init__ .py:

from .celery import app as celery_app

# 使用all的用法就只会对外暴露celery_app
__all__ = ['celery_app',]

在settings.py中添加,其中backend 和 broker会需要用到redis或者mq。请先安装

CELERY_TIMEZONE = TIME_ZONE

CELERY_TASK_TIME_LIMIT = 600  

CELERY_RESULT_EXPIRES = 259200

# CELERY_ENABLE_UTC = False

# CELERY_TIMEZONE = TIME_ZONE

DJANGO_CELERY_BEAT_TZ_AWARE = False

# CELERY_BEAT_SCHEDULER = 'django-celery-beat.schedulers.DatabaseScheduler'

CELERY_WORKER_CONCURRENCY = 10

CELERYD_PREFETCH_MULTIPLIER = 20

CELERYD_FORCE_EXECV = True

CELERY_WORKER_MAX_TASKS_PER_CHILD = 100

CELERY_DISABLE_RATE_LIMITS = True

CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2'

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

# 引入需要监控的异步任务
CELERY_IMPORTS = ("task_async.tasks",)

启动worker:

在celery目录的上一层目录去执行

celery -A app的名称 worker --loglevel=info -P eventlet (app的名称是celery文件所在目录的名称)

关闭worker

立即退出服务,不管任务是否完成。

celery multi stop w1 -A proj -l info

安全关闭works服务,会等待正在执行的任务完成后再推出workor服务。

celery multi stopwait w1 -A proj -l info

使用django创建app,名称为task_async,在app下面创建tasks.py:

import time
# Celery实例化的就是app
from app的名称 import app


@app.task()
def long_time_func():
    time.sleep(10)
    return 'success'

启动celery:(函数已经被监控)

 如何调用?

在task_async目录下面创建taiste文件夹,在taisite文件夹下面创建taiste.py(因为tasks里面的异步任务,不要和调用代码在同一个路径下面,会发现找不到的异常)

from task_async.tasks import long_time_func

# 有参数的话直接传在delay里面
long_time_func.delay()

运行本py文件调用成功:

 获取结果:

在taist目录下面创建result.py

from dasdasd import app
# taskid在调用的时候会返回,记住是用Celery对象去调用,而不是类
res = app.AsyncResult("21232187-d8d4-4d0f-ac92-d902e9c36457")  # 参数为task id

print(res.result)

Celery定时任务:

主要实现可增删改查的定时任务,使用插件

'django_celery_results',
'django_celery_beat',

记得在settings里面配置。

配置好后,先迁移数据库 python manage.py migrate,生成数据表。

操作定时任务调用插件的orm

from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
# 创建任务时间,根据CrontabSchedule创建和相隔的 周期触发IntervalSchedele
schedule, _ = CrontabSchedule.objects.get_or_create(
                minute=cron_exp["minute"],
                hour=cron_exp["hour"],
                day_of_week=cron_exp['day_of_week'],
                day_of_month=cron_exp["day_of_month"],)

# 创建任务,更改任务的时候回去触发定时任务的修改。
PeriodicTask.objects.update_or_create(
            enabled=True,
            crontab=schedule,
            name=task_name,
            task='task_async.tasks.create_case_task',
            kwargs=
            json.dumps(
                {
                    "task_name": task_name,
                    "case_mark": case_marks,
                    "proj_name": run_params["project_name"],
                    "case_path": case_path,
                    "auto_trigger_run_params": run_params,
                    "trigger_type": "auto"
                }
            )
        )

最后启动beat即可:

celery -A app的名称 beat -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值