django2 django-celery djcelery beat task 循环任务 - Go语言中文社区

django2 django-celery djcelery beat task 循环任务


Celery

https://github.com/Coxhuang/django-celery.git

#0 需求

每隔3秒钟,把当前的时间写入数据库

#1 环境

1.1安装

Django (2.0.7)
celery (3.1.23)
django-celery (3.2.2) # 如果Django是2以上的版本,django-celery不能是低版本
django-crontab (0.7.1)
django-redis (4.9.0)

1.2前提条件

#2 项目结构

├─app
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tasks.py      # 新增文件
│  │  tests.py
│  │  views.py
│  │  __init__.py
│
├─celery_pro
│  │  celery.py     # 新增文件
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│
└─templates

#3 修改

3.1 settings.py

修改INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'djcelery',
    'app',
]

在末尾加上

import djcelery
from celery.schedules import crontab
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'


from datetime import timedelta


CELERYBEAT_SCHEDULE = {
    'celery_test': {
        'task': 'app.tasks.test_celery',
        'schedule': timedelta(seconds=3), # 每隔3秒执行一次
        'args': (16, 16)
    },
}

修改时区

TIME_ZONE = 'Asia/Shanghai' # 修改为上海时间
USE_I18N = True
USE_L10N = True
USE_TZ = False

3.2 tasks.py

在app目录下新建tasks.py文件

from __future__ import absolute_import
from celery import task
from app import models
import datetime

@task
def test_celery(x, y):
    models.CeleryModels.objects.create(time=datetime.datetime.now()) # 把当前时间写入数据库
    print("参数相加结果:",x+y)
    return "我是测试函数"

3.3 celery.py

在celery_pro目录下 ( settings.py同一目录 ) 新建celery.py文件

from __future__ import absolute_import

import os

from celery import Celery, platforms

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_pro.settings') # 修改成celery_pro项目名

from django.conf import settings  # noqa

app = Celery('celery_pro') # 修改成celery_pro项目名
platforms.C_FORCE_ROOT = True

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

3.4 models.py

from django.db import models

class CeleryModels(models.Model):

    time = models.DateTimeField(auto_now_add=True)

#4 运行

4.1 首次运行

数据库迁移

python manage.py makemigrations
python manage.py migrate

4.2 celery

进入django项目的根目录执行如下代码启动celery的worker(在manage.py同一目录下):

celery -A celery_pro worker -l info # celery_pro 项目名

同样在django项目的根目录下再打开一个命令行界面,执行如下代码(在manage.py同一目录下):

celery -A celery_pro beat -l info # celery_pro 项目名

在这里插入图片描述

在这里插入图片描述

#6 配置celery后台运行(守护进程)

https://blog.csdn.net/Coxhuang/article/details/86921407

#7 flower

#7.1 安装

pip3 install flower

#7.2 使用

启动

celery -A app名 flower

https://flower-docs-cn.readthedocs.io/zh/latest/install.html#id2

#8 补充

#8.1 清空任务

在Django settings.py中设置定时任务时,存在这样一个问题:定时任务1不想要了,把代码删掉,但是在启动beat时,定时任务1还是会执行,如何把他从任务列表中删除呢?

  • 进入数据库
  • 找到djcelery_periodictask这个表
  • djcelery_periodictask这个表就是存放任务的列表,把不想继续执行的任务删除即可

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Coxhuang/article/details/86481343
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢