Celery学习---Celery 与django结合实现计划任务功能

项目的目录结构:

项目前提: 安装并启动Redis

安装Django和Celery的定时任务插件

安装方法一: pip直接安装【安装了pip的前提下】

[email protected]:~$  pip3 install django-celery-beat

安装方法二:直接源安装

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django-celery-beat

CeleryTest/settings.py

INSTALLED_APPS = [
   ...
 ‘app01‘,   # 注册app
‘django_celery_beat‘,  # Celery的定时任务和Django结合

]
MIDDLEWARE = [
...
# ‘django.middleware.csrf.CsrfViewMiddleware‘,
      ...
]

STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),)  # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
   ...
   ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],
]
# for celery
CELERY_BROKER_URL = ‘redis://192.168.2.105‘,
CELERY_BACKEND_URL = ‘redis://192.168.2.105‘,  # 用于Celery的返回结果的接收

插件利用创建表来管理定时任务的

[email protected]:~/Celery/CeleryTest$ cd /home/omc/Celery/CeleryTest
[email protected]:~/Celery/CeleryTest$ python3 manage.py migrate

CeleryTest/urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
path(‘admin/‘, admin.site.urls),
   url(r‘index/‘, views.Index),
]

app01/tasks.py  文件名必须为tasks.py

# 文件名必须为tasks.py,Djaogo才能发现Celery
from __future__ import absolute_import, unicode_literals
from celery import shared_task

# Django starts so that the @shared_task decorator (mentioned later) will use it:  
@shared_task    # Django的各个App里都可以导入这个任务,否则只能在app01这个Django的App内使用
def add(x, y):
    return x + y

@shared_task
def mul(x, y):
    return x * y

@shared_task
def xsum(numbers):
    return sum(numbers)

CeleryTest/celery.py 文件名必须为celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the ‘celery‘ program.
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘CeleryTest.settings‘)

app = Celery(‘CeleryTest‘)

# Using a string here means the worker don‘t have to serialize
# the configuration object to child processes.
# - namespace=‘CELERY‘ means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object(‘django.conf:settings‘, namespace=‘CELERY‘)

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
    print(‘Request: {0!r}‘.format(self.request))

CeleryTest/__init__.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = [‘celery_app‘]

上传文件到Linux服务器【Linux服务器需安装好Django服务】

需要Ubuntu下安装Django

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django

在Linux的后台启动任务:

[email protected]:~/Celery/CeleryTest$ python3 manage.py runserver 0.0.0.0:9000

在Linux的后台创建super用户:

[email protected]:~/Celery/CeleryTest$  cd /home/omc/Celery/CeleryTest
[email protected]:~/Celery/CeleryTest$  python3 manage.py createsuperuser

在Win7下浏览器访问:

http://192.168.2.105:9000/admin/

在admin页面里,多了4张表

添加存储计划:页面之间添加即可

Intervals表创建一个10秒的任务

添加一个periodictask任务

注意:到此只是存储了一个定时计划而已,执行不了

Celery-beat调度器从Django内读取任务后发布给Celery的worker去执行

Linux后台启动Celery的worker

[email protected]:~/Celery/CeleryTest$  cd /home/omc/Celery/CeleryTest
[email protected]:~/Celery/CeleryTest$  celery -A  CeleryTest worker -l info

启动Celery-beat的调度器:从django内读取定时任务让后台worker执行

[email protected]:/etc/redis$ cd /home/omc/Celery/CeleryTest/
[email protected]:~/Celery/CeleryTest$ celery -A CeleryTest beat -l info -S django  

右侧定时调取,左侧执行任务

简单梳理一下:后台上传Django和Celery整合后的文件,配置好Celery-beat后,在Linux后台启动Django项目,从Win7下访问admin进入页面后有一个定时任务的配置页面,配置好了页面的定时任务后,在Linux后台启动Celery的worker, 启动Celery-beat的调度器。此时调度器从Django内的schedule表中获取任务同时调用Celery的worker去执行任务,从而达到定时执行任务的效果。

问题解决

跨机器访问[Win7访问Linux下Django服务]:

问题现象一:直接无法访问:

# 9000端口仅仅监测本机的连接
[email protected]:~$ netstat -an|grep 9000

问题定位: Django启动方式错误

问题解决: 重新启动Django项目

错误的:python3 manage.py runserver 9000   【少了定向IP】
正确的:python3 manage.py runserver 0.0.0.0:9000

问题现象二:Win7下访问Linux下的Django和Celery结合的项目

问题解决:

更改settings.py里面的ALLOWED_HOSTS配置后重启服务

ALLOWED_HOSTS = [‘*‘]  # 所有都可以访问

问题二:

问题现象: AttributeError: module ‘CeleryTest‘ has no attribute ‘celery‘

问题定位: 1.未进入到项目内,所以无法找到命名为celery的文件

2.项目内没有一个命名为celery.py的文件

原文地址:https://www.cnblogs.com/ftl1012/p/9457851.html

时间: 2024-10-28 20:08:03

Celery学习---Celery 与django结合实现计划任务功能的相关文章

Celery学习--- Celery 最佳实践之与django结合实现异步任务

django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求根据ID查询结果 项目整合 项目的目录结构: 项目前提: 安装并启动Redis CeleryTest/settings.py INSTALLED_APPS = [ ... 'app01', # 注册app ] MIDDLEWARE = [ ... # 'django.middleware.csrf.

Celery学习---Celery 分布式队列介绍及安装

Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 1. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情. 2. 你想做一个定时任务,比如每天检测

Celery学习--- Celery在项目中的使用

可以把celery配置成一个应用,注意连接文件命名必须为celery.py 目录格式如下 项目前提: 安装并启动Redis CeleryPro/celery.py   [命名必须为celery.py] # 将相对路径转换为绝对路径 from __future__ import absolute_import, unicode_literals from celery import Celery # 定义了一个Celery的App app = Celery('tasks', # redis://:

Celery学习--- Celery操作之定时任务

celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat 文件定时执行任务 项目前提: 安装并启动Redis celery_Schedule.py # version: python3.2.5 # author: 'lft415659' from celery import Celery from celery.schedules import crontab # 可以实现复杂的定时任务 app = Celery('Celery

celery学习笔记2

1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部分 (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代码,当然还包括python调用系统工具功能) (2)broker部分负责任务消息的分发以及任务结果的存储,这部分任务主要由中间数据存储系统完成,比如消息队列服务器RabbitMQ.redis.Amazon SQS.MongoDB.IronMQ等或者关系型数据库,使用关系型数据库依赖sqlalchem

celery学习

1.安装 django-celery.celery.django-redis等一系列package 2.setting.py设置: djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/0' CELERY_TIMEZONE='Asia/Shanghai' #并没有北京时区,与下面TIME_ZONE应该一致 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

7,知识拾遗-Wusir-crm项目-celery初识-celery案例

参考博客: https://www.cnblogs.com/wupeiqi/articles/8796552.html 什么情况下使用celery: 一个请求的处理时间特别长 先进行安装: pip3 install celerypip3 install eventlet user:用户程序,用于告知celery去执行一个任务. broker: 存放任务(依赖RabbitMQ或Redis,进行存储) worker:执行任务 / 依赖redis做消息队列(存放任务和结果) // // worker

利用shell脚本实现计划任务功能 V1.2

2013.05.10  mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1.0 版后(利用shell脚本实现计划任务功能),一直在想着如何解决那个最后的遗留问题"每个任务脚本中声明的函数名必须唯一不能重复,否则会导致任务函数覆盖.",无意间自问了一句为什么不能像crontab那样直接调用脚本和命令呢?这一问才让自己回忆起来,之所以用function封装任务是因为早

在SharePoint 2013 中使用文档库Scheduling (计划发布功能)

本文讲述在SharePoint2013 中使用文档库Scheduling (计划发布功能)的步骤和注意的事项. 文档库Scheduling (计划发布功能) 用于设定当文档通过审批后特定的时间区间内才可以被普通用(非管理员,审批人员和作者)户看到.也就是说要启用Scheduling,必须先启用文档库的内容审批和小版本控制.这是官方文档的说法,但是笔者注意到除此之外Draft Item Security要设置成Only users who can approveitems (and the aut