django-celery定时任务以及异步任务and服务器部署并且运行全部过程

Celery

应用Celery之前,我想大家都已经了解了,什么是Celery,Celery可以做什么,等等一些关于Celery的问题,在这里我就不一一解释了。

应用之前,要确保环境中添加了Celery包。

pip install celery
pip install dajngo-celery

安装完成之后我们还需要安装,Redis or RabbitMQ 需要用到它们来建立消息队列来完成收,发任务。

RabbitMQ用户手册:

https://www.rabbitmq.com/manpages.html

Redis中文官网:

http://www.redis.cn/

用以上两种作为消息处理队列都可以,今天我们来使用Redis来作为队列。

本人是用Windows来测试,后边有Linux安装方法。

下载安装包链接: https://github.com/MSOpenTech/redis

打开链接之后,出现如下页面,然后点击     releases

进入到下载页面之后,找到需要下载的版本,测试版本(3.0.500)然后点击版本名称进入当前版本页面。

下载之前需要注意的是,红框中,第一个msi后缀的是微软格式的安装包,第二个zip是压缩包。

下载完成之后,双击msi文件。

安装完成之后,以便从程序后续能够正常工作,添加访问密码,

打开安装目录,找到  redis.windows-service.conf 配置文件,用文本编辑器打开,找到 requirepass字样的地方,添加一行 requirepass 密码。 这是访问redis时需要的密码。一般情况下是可以不用设置的,但是建议还是设置一下。(我用Notepad++打开的)位置:386 

配置完成之后,点击"开始>右击"计算机">"管理", 在左侧找到"计算机管理(本地)">服务和应用程序>服务,再在右侧找到Redis名称的服务,查看启动状态,没有启动则手动启动,一般情况下服务该正常运行了。

Redis服务启动过程中,报位置错误的情况下,解决办法如下:

1、打开redis安装目录找到redis.windows.conf文件拉到底部,添加  maxmemory 209715200

2、添加完成之后保存退出,打开终端,用命令启动, redis-service.exe redis-windows.conf

3、启动过程中在报错,错误信息: 

[22420] 11 Oct 11:46:23.351 # Server started, Redis version 3.0.500
[22420] 11 Oct 11:46:23.355 # Can't handle RDB format version 7
[22420] 11 Oct 11:46:23.355 # Fatal error loading the DB: Invalid argument. Exiting.

解决办法:

删除所有的dump.rdb文件,重启新启动, redis-service.exe文件,报错原因,可能是rdb文件版本过高或者过低所导致问题出现,

启动成功界面:

redis启动成功之后就不要关闭,应为celery是基于redis来收发任务的, 需要用到redis的队列。

环境到此安装完成之后,开始写个简单的异步任务。

Celery 异步任务

新创建一个Django项目,添加一个应用。

django-admin startproject celery_sq

新建应用

python manage.py startapp app

项目初始化完成之后,打开settings.py文件

一定要将celery导入进去,才可以使用。紧接着导入需要用到的模块。

from celery.schedules import crontab
from celery.schedules import timedelta
导入

在settings文件拉到底部,添加以下代码。

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/'
CELERY_IMPORTS = ('app.tasks')
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
底部添加代码

以上代码添加完成之后再同级目录下创建 celery.py

from __future__ import absolute_import, unicode_literals
# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/9 15:52
# @Email   :  : 1922878025@qq.com
import os
from celery import Celery
from django.conf import settings# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_sq.settings')app = Celery('celery_sq')# 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')# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)@app.task(bind=True)
def debug_task(self):print('Request: {0!r}'.format(self.request))
celery.py

在app目录下添加tasks.py文件, 注意:一个应用下只能添加一个tasks.py 一个py一遍可写多个任务。

from __future__ import absolute_import
# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/9 16:10
# @Email   :  : 1922878025@qq.com
from celery_sq.celery import app@app.task
def add(x, y):return x + y
tasks.py

添加完成之后,在app同级目录下的views文件里边添加函数。

from django.shortcuts import render, HttpResponse# Create your views here.
from .tasks import add
import jsondef add_handler(request):x = request.GET.get('x', 1)y = request.GET.get('y', 1)result = add(int(x), int(y))return HttpResponse(json.dumps({'result': result}))
views.py

添加urls.py

# -*- coding: utf-8 -*-
__author__ = 'YongCong Wu'
# @Time    : 2018/10/10 14:46
# @Email   :  : 1922878025@qq.comfrom django.conf.urls import include, url
from django.contrib import admin
from app import viewsurlpatterns = [url(r'^add/', views.add_handler),
]
urls.py

app 中的url添加完成之后需要在celery_sq目录下的urls.py中添加。

from django.conf.urls import include, url
from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^home/', include('app.urls')),    # 添加这个
]    
celery_sq/urls.py

添加完成之后就开始测试我们的项目,现将项目运行起来。

python manage.pu runserver

项目启动完成之后,重新打开一个终端,进入项目目录,启动django celery 服务。

python manage.py celery worker --loglevel=info

见到这个界面,就说明django celery已经启动成功了,接下来就开始测试我们的异步任务了。

测试地址端口可自行修改,根据自己端口来设置:    http://127.0.0.1:9000/home/add/?x=5&y=5

Celery定时任务

 现在每家公司,有各种各样的需求,有的需要定时去查找数据等等,一些定时的功能。接下来,我们就用Celery来完成一个定时写入txt文件的一个任务。

app/tasks.py文件添加以下代码。

from celery import shared_task@shared_task
def hello_world():with open("output.txt", "a") as f:f.write("hello world")f.write("\n")
tasks.py

在settings.py下添加

CELERYBEAT_SCHEDULE = {  # 定时器策略# 定时任务一: 每隔30s运行一次u'测试定时器1': {"task": "app.tasks.tsend_email",# "schedule": crontab(minute='*/2'),  # or 'schedule':   timedelta(seconds=3),"schedule": timedelta(seconds=30),"args": (),},
}
定时

此时tasks.py文件里边有一个定时tasks。

参数定义:

days             天
seconds        秒 
microseconds    微秒
milliseconds      毫秒
minutes            分
hours                小时
timedelta参数含义
month_of_year        月份
day_of_month         日期
day_of_week           周
hour                       小时
minute                    分钟
crontab参数含义

定时任务添加完成之后,启动celery beat, celery启动了一个beat进程一直在不断的判断是否有任务需要执行。

celery -A celery_sq beat -l info

重新打开终端,输入以上命令启动  celery beat, 启动成功之后看到如下页面。

任务成功执行之后状态

  

到此为止,在windows下,测试异步任务和定时任务已经完成,那么有个问题,在windows下执行一下celery需要打开这么多的终端窗口,哪用linux部署项目的时候该怎么办呢,接下来,我们就在linux下部署。我们用守护进程的方式来完成。

Linux下部署django-celery

Linux默认Python环境是2.7,需要自行下载Pyhton3.5。(安装过程自行百度)

linux下,我们一般用守护进程的方式来启动 Celery ,不然总不能在打开很多窗口一个窗口启动一个beat等等吧。

在linux下使用supervisor来守护进程。

supervisor官网:

http://supervisord.org

安装Redis:

wget http://download.redis.io/releases/redis-2.8.3.tar.gz

安装完成之后需要解压,编译。依次按照以下命令执行。

tar xzf  redis-2.8.3.tar.gz

cd redis-2.8.3

make && make install

安装supervisor

pip install supervisor

supervisor配置

我们使用echo_supervisord_conf命令来得到supervisor配置模板,打开终端shell输入以下命令。

echo_supervisord_conf > supervisord.conf

 

接下来编辑 supervisord.conf文件

vim supervisord.conf

修改include分发ini文件目录。

配置完成之后创建conf.d目录

mkdir conf.d

创建完成之后进入目录,创建ini文件将以下配置写入文件中。

测试添加ini文件是否读取。

在任意目录下创建hello.py文件,添加以下代码,来进行测试。

import time
import sys
while True:print("test data\n")sys.stdout.flush()time.sleep(1)

添加完成之后保存,用 python 文件名称 来执行py文件是否出错。正确结果:

测试完成之后开始为hello.py添加进程守护。

进入conf.d目录添加 hello.ini文件。将以下配置写入文件。

[program:hello]        名字随意,不要重复
command=python /home/hello.py
stdout_Logfile=/home/celery_log/hello.log
stderr_logfile=/home/celery_log/hello_error.log

运行supervisord

supervisord -c /home/supervisor/supervisord.conf

运行hello进程

supervisordctl -c /home/supervisor/supervisord.conf      运行全部supervisordctl -c /home/supervisor/supervisord.conf start heelo     指定运行supervisordctl -c /home/supervisor/supervisord.conf stop heelo     指定停止参数:  start status stop restart         启动,状态, 停止, 重启

以上图片是启动成功之后的状态。

测试完成之后就开始配置Redis。

添加redis.ini文件,将以下内容添加。

[program:redis]
command=/home/redis-4.0.1/src/redis-server
autostart=true
autorestart=true
startsecs=3
stdout_Logfile=/home/celery_Log/redis.log    标准日志输出
stderr_logfile=/home/celery_log/redis_error.log     错误日志输出

添加完成之后需要使用以下命令来加载进程。

supervisorctl reload

由于 supervisor 管理的进程不能设置为 daemon 模式,故如果 Redis 无法正常启动,可以查看一下 Redis 的配置,并将daemonize选项设置为 no。

daemonize no

到文件的地步添加如下信息

[program:celery]# 启动命令入口command=/var/www/newweb/venv/bin/celery worker -A celery_worker.celery --loglevel=info# 命令程序所在目录directory=/var/www/newweb/# 运行命令的用户名user=rootautostart=trueautorestart=true# 日志地址stdout_logfile=/var/log/newymw2.0/supervisor/newymw2.0_celery.log

另外在celery.worker下设置beat定时任务的进程

[program:celery.beat] 
;指定运行目录 
directory=/home/xxx/webapps/yshblog_app/yshblog
;运行目录下执行命令
command=celery -A yshblog worker --loglevel info --logfile celery_beat.log;启动设置 
numprocs=1          ;进程数
autostart=true      ;当supervisor启动时,程序将会自动启动 
autorestart=true    ;自动重启;停止信号
stopsignal=INT

worker和beat都设置好之后就可以配置redis了。

[program:redis]
;指定运行目录 
directory=~/webapps/yshblog_app/lib/redis-3.2.8/
;执行命令(redis-server redis配置文件路径)
command=redis-server redis.conf;启动设置 
numprocs=1          ;进程数
autostart=true      ;当supervisor启动时,程序将会自动启动 
autorestart=true    ;自动重启;停止信号
stopsignal=INT

启动supervisord

supervisord -c /home/supervisor/supervisor.conf

查看进程状态

supervisorctl -c /home/supervisor/supervisor.conf status all

加载supervisord,在新添加进程的情况下使用加载,新添加一个,加载一次。

supervisorctl -c /home/supervisor/supervisor.conf reload

运行测试celery过程中如果出现如下错误(celery不能用root用户来启动),按照以下步骤添加,即可解决

测试命令:

 celery -A celery_sq worker -l info

错误信息:

Running a worker with superuser privileges when the
worker accepts messages serialized with pickle is a very bad idea!If you really want to continue then you have to set the C_FORCE_ROOT
environment variable (but please think about this before you do).User information: uid=0 euid=0 gid=0 egid=0

解决办法:

celery.py添加如下代码from celery import Celery, platformsplatforms.C_FORCE_ROOT = True

测试成功页面

 测试成功之后开始测试beat

测试beat命令:

celery -A celery_sq beat -l info

测试成功页面:

成功之后守护进程就是这个样子的。

 

[program:redis]
command=/home/redis-4.0.1/src/redis-server
autostart=true
autorestart=true
startsecs=3
stdout_Logfile=/home/celery_log/redis.log
stderr_logfile=/home/celery_log/redis_error.log
redis.ini
[program:celeryworker]
directory=/root/.pyenv/versions/Celery_prj/celery_sq
command=celery -A celery_sq worker -l info 
autostart=true
autorestart=true
stdout_logfile=/home/celery_log/celery_worker.log
stderr_logfile=/home/celery_log/celery_worker_error.log
worker.ini
[program:celerybeat]
directory=/root/.pyenv/versions/Celery_prj/celery_sq
command=celery -A celery_sq beat -l info
autostart=true
autorestart=true
stdout_logfile=/home/celery_log/celery_beat.log
stderr_logfile=/home/celery_log/celery_beat_error.log
beat.ini

到此为止,windows以及Linux下django-celery守护进程以及配置全部完成,    以上由本人全部亲测,一步一步写进博客,如有问题,请及时提出。见到第一时间修改。/抱拳

 

转载于:https://www.cnblogs.com/wuyongcong/p/9773345.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页视频15分钟自动暂停_在15分钟内学习网页爬取

网页视频15分钟自动暂停什么是网页抓取? (What is Web Scraping?) Web scraping, also known as web data extraction, is the process of retrieving or “scraping” data from a website. This information is collected and then exported into a format that …

前嗅ForeSpider教程:创建模板

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中创建模板。主要内容有:模板的概念,模板的配置方式,模板的高级选项,具体内容如下: 一,模板的概念 模板列表的层级相当于网页跳转…

django 性能优化_优化Django管理员

django 性能优化Managing data from the Django administration interface should be fast and easy, especially when we have a lot of data to manage.从Django管理界面管理数据应该快速简便,尤其是当我们要管理大量数据时。 To improve that process and to ma…

3D场景中选取场景中的物体。

杨航最近在学Unity3D在一些经典的游戏中,需要玩家在一个3D场景中选取场景中的物体。例如《仙剑奇侠传》,选择要攻击的敌人时、为我方角色增加血量、为我方角色添加状态,通常我们使用鼠标来选…

canva怎么使用_使用Canva进行数据可视化项目的4个主要好处

canva怎么使用(Notes: All opinions are my own. I am not affiliated with Canva in any way)(注意:所有观点均为我自己。我与Canva毫无关系) Canva is a very popular design platform that I thought I would never use to create the deliverable for a Data V…

如何利用Shader来渲染游戏中的3D角色

杨航最近在学Unity3D 本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。 一、从Shader开始 1、通过Assets->Create->Shader来创建一个默认的Shader,并取名…

Css单位

尺寸 颜色 转载于:https://www.cnblogs.com/jsunny/p/9866679.html

ai驱动数据安全治理_JupyterLab中的AI驱动的代码完成

ai驱动数据安全治理As a data scientist, you almost surely use a form of Jupyter Notebooks. Hopefully, you have moved over to the goodness of JupyterLab with its integrated sidebar, tabs, and more. When it first launched in 2018, JupyterLab was great but fel…

【Android】Retrofit 2.0 的使用

一、概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库。来自官网的介绍: A type-safe HTTP client for Android and JavaRest API是一种软件设计风格,服务器作为资源存放地。客户端去请求GET,PUT, POST,DELETE资源。并且是无…

Mysql常用命令(二)

对数据库的操作 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database db1; # 查看所有的数据库 show databases; 改 alter database db1 charset gbk; 删 drop database db1; 对表的操作 use db1; #切换文件夹select database(); #查看当前所…

python中定义数据结构_Python中的数据结构—简介

python中定义数据结构You have multiples algorithms, the steps of which require fetching the smallest value in a collection at any given point of time. Values are assigned to variables but are constantly modified, making it impossible for you to remember all…

Unity3D 场景与C# Control进行结合

杨航最近在自学Unity3D,打算使用这个时髦、流行、强大的游戏引擎开发一个三维业务展示系统,不过发现游戏的UI和业务系统的UI还是有一定的差别,很多的用户还是比较习惯WinForm或者WPF中的UI形式,于是在网上搜了一下WinForm和Unity3…

数据质量提升_合作提高数据质量

数据质量提升Author Vlad Rișcuția is joined for this article by co-authors Wayne Yim and Ayyappan Balasubramanian.作者 Vlad Rișcuția 和合著者 Wayne Yim 和 Ayyappan Balasubramanian 共同撰写了这篇文章 。 为什么要数据质量? (Why data quality?) …

unity3d 人员控制代码

普通浏览复制代码private var walkSpeed : float 1.0;private var gravity 100.0;private var moveDirection : Vector3 Vector3.zero;private var charController : CharacterController;function Start(){charController GetComponent(CharacterController);animation.w…

删除wallet里面登机牌_登机牌丢失问题

删除wallet里面登机牌On a sold-out flight, 100 people line up to board the plane. The first passenger in the line has lost his boarding pass but was allowed in regardless. He takes a random seat. Each subsequent passenger takes their assigned seat if availa…

字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作

字符串操作截取后面的字符串We have to represent every bit of data in numerical values to be processed and analyzed by machine learning and deep learning models. However, strings do not usually come in a nice and clean format and require preprocessing to con…

最新 Unity3D鼠标滑轮控制物体放大缩小 [

var s 1.0;function Update () {var cube GameObject.Find("Cube");if(Input.GetAxis("Mouse ScrollWheel")){s Input.GetAxis("Mouse ScrollWheel");cube.transform.localScaleVector3(1*s,1*s,1*s);}}

sublime-text3 安装 emmet 插件

下载sublime,http://www.sublimetext.com/ 安装package control :https://packagecontrol.io/ins... 这个地址需要翻墙,访问不了的可以看下图 import urllib.request,os,hashlib; h 6f4c264a24d933ce70df5dedcf1dcaee ebe013ee18cced0ef93d…

unity3d]鼠标点击地面人物自动走动(也包含按键wasdspace控制)

目录(?)[-] 一效果图二大概步骤 创建一个plane设置层为Terrain因为后面要判断是否点击的是这个层准备好人物模型并且将三个脚本拖放到人物上并且将动画文件也拖放好记得看前面提醒哦 ThirdPersonCamera相当于smoothflowThirdPersonController修改版mouseMoveContr鼠标点击人物…

Web 开发基础

一、 Web 开发简介 最早的软件都是运行在大型机上的,软件使用者登陆到大型机上去运行软件。后来随着 PC 机的兴起,软件开始主要运行在桌面上,而数据库这样的软件运行在服务器端,这种 Client/Server 模式简称 CS 架构。随着互联网的…