专栏首页Coxhuangdjango2 django-celery djcelery beat task 循环任务

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这个表就是存放任务的列表,把不想继续执行的任务删除即可

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django Celery4 定时任务配置和使用

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmAFvGY0-1591876971277)(https://raw.githu...

    Coxhuang
  • Django DjangoFilterBackend django-filter

    注意 : 在url的参数中,原来我们在filters.py中定义的变量是 “RegDate”,到了url中变成了 “RegDate_after” 和 “RegD...

    Coxhuang
  • Vue学习-iView组件-Form表单

    Coxhuang
  • python高阶函数备忘录

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    MyJie
  • MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    这种说法愈演愈烈,甚至被很多同学奉为真理。咱啥话也不说,举个例子。假如我们有个表s1,结构如下:

    帅地
  • MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    这种说法愈演愈烈,甚至被很多同学奉为真理。咱啥话也不说,举个例子。假如我们有个表s1,结构如下:

    黄泽杰
  • MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

    这种说法愈演愈烈,甚至被很多同学奉为真理。咱啥话也不说,举个例子。假如我们有个表s1,结构如下:

    JAVA葵花宝典
  • R包各大镜像纷纷宕机

    这个对初学者来说,的确很难理解,如果你参加学习班的话,就有讲师和助教团队协助解决了(感兴趣的可以点击下面两个课程)

    生信技能树
  • 稀土金属在光学中的应用

    来自因为贸易战的关系,稀土金属成为了热点。这一篇笔记就聊一聊稀土金属在光学中的应用。

    光学小豆芽
  • Python、Unicode和中文

    python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识。当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,...

    py3study

扫码关注云+社区

领取腾讯云代金券