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 json def 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.com from django.conf.urls import include, url
from django.contrib import admin
from app import views urlpatterns = [
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 admin urlpatterns = [
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=root autostart=true autorestart=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, platforms

platforms.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守护进程以及配置全部完成,    以上由本人全部亲测,一步一步写进博客,如有问题,请及时提出。见到第一时间修改。/抱拳

django-celery定时任务以及异步任务and服务器部署并且运行全部过程的更多相关文章

  1. Django+Celery+xadmin实现异步任务和定时任务

    Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...

  2. Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: #coding:utf- from celery.task.schedules ...

  3. Bamboo Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...

  4. django celery的分布式异步之路(二) 高并发

    当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...

  5. django celery的分布式异步之路(一) 起步

    如果你看完本文还有兴趣的话,可以看看进阶篇:http://www.cnblogs.com/kangoroo/p/7300433.html 设想你遇到如下场景: 1)高并发 2)请求的执行相当消耗机器资 ...

  6. Django+Celery+Redis实现异步任务(发送邮件)

    安装如下依赖库 pip install Celery pip install django-celery pip install django-redis 还要安装本地的Redis服务 setting ...

  7. django+celery+ RabbitMQ实现异步任务实例

    背景   django要是针对上传文件等需要异步操作的场景时,celery是一个非常不错的选择.笔者的项目就是使用了这个组合,这里就做一个备忘吧. 安装RabbitMQ   这个安装及使用我已经在前一 ...

  8. django celery 定时任务

    可参考上一篇:http://www.cnblogs.com/wumingxiaoyao/p/8515075.html 1. 安装 django-celery-beat pip3 install dja ...

  9. 如何使用django+celery+RabbitMQ实现异步执行

    1)安装需要安装RabbitMQ.Celery和Django-celeryCelery和Django-celery的安装直接pip就好 2)修改settings.py在INSTALLED_APPS中加 ...

随机推荐

  1. new Runnable中的 this

    package com.test; public class BB extends AA{ public String bb = "bbbbb"; public void gg() ...

  2. MySQL中的基本SQL语句

    标准SQL包含了4种基本的语句类别: DDL语句,数据定义语句,主要用来定义数据库,表名,字段,例如create,drop,alter. DML语句,数据操作语句,用来对数据记录的增删改查,还用来保证 ...

  3. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

  4. P1516/bzoj1477 青蛙的约会

    青蛙的约会 exgcd 根据题意列出方程: 设所用时间为T,相差R圈时相遇 (x+T*m)-(y+T*n)=R*l 移项转换,得 T*(n-m)-R*l=x-y 设a=n-m,b=l,c=x-y,x_ ...

  5. 20135234mqy-——信息安全系统设计基础第九周学习总结

    第十章 系统级I/O 10.1 Unix I/O 一个Unix文就是一个m个字节的序列 Unix:将设备映射为文件的方式,允许Unix内核引出一个简单低级的应用接口 能够使得所有输入输出都能以一种统一 ...

  6. python函数总结

    1.函数是一种子程序.程序员使用函数来减少代码重复,并用于组织或模块化程序.一旦定义了函数,它可以从程序中的许多不同位置被多次调用.参数允许函数具有可更改的部分.函数定义中出现的参数称之为形参,函数调 ...

  7. Mac安装和卸载HomeBrew

    安装方法: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/ ...

  8. IHttpHandler IHttpModule

    ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...

  9. 51nod 1021 石子归并 区间DP

    1021 石子归并  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆 ...

  10. bootstrap datarangepicker如何使用

    本文为博主原创,未经允许不得转载: 下载资源文件: 地址:Github:https://github.com/dangrossman/bootstrap-daterangepicker/ 1.页面引用 ...