没废话,直接上代码。
环境说明:
python3.6
django2.0.5
我们使用redis的作为celery任务队列,有一个合成包可以直接安装两者一起使用需要的安装包
直接在终端键入
1
|
pip install celery - with - redis
|
就可以安装需要的依赖包了
构建项目过程略过,直接开始进行celery配置
一、celery配置。
我们的项目名称为myproject,首先setting配置,添加
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# celery settings
# celery中间人 redis://redis服务所在的ip地址:端口/数据库号
BROKER_URL = 'redis://localhost:6379/3'
# celery结果返回,可用于跟踪结果
CELERY_RESULT_BACKEND = 'redis://localhost:6379/3'
# celery内容等消息的格式设置
CELERY_ACCEPT_CONTENT = [ 'application/json' , ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = TIME_ZONE
|
然后在PATH/myproject/myproject/即setting的同级目录下创建celery.py,初始化celery。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from __future__ import absolute_import, unicode_literals
from celery import Celery
from django.conf import settings
import os
# 获取当前文件夹名,即为该Django的项目名
project_name = os.path.split(os.path.abspath( '.' ))[ - 1 ]
project_settings = '%s.settings' % project_name
# 设置环境变量
os.environ.setdefault( 'DJANGO_SETTINGS_MODULE' , project_settings)
# 实例化Celery
app = Celery(project_name)
# 使用django的settings文件配置celery
app.config_from_object( 'django.conf:settings' )
# Celery加载所有注册的应用
app.autodiscover_tasks( lambda : settings.INSTALLED_APPS)
|
这里第一行输入不能换位置,只能在首行,否则会报错。
这里的实例化celery的app我们在别处要导入,为了方便导入,我们把它放到__init__.py里,所以在/myproject/myproject/__init__.py我们加入
1
2
3
4
|
from __future__ import absolute_import, unicode_literals
# 引入celery实例对象
from .celery import app as celery_app
|
这样同时也能告知django celery.py文件的存在。
二、用celery装饰我们的需要进行的异步函数。
我们在项目根目录下创建celery_tasks模块,即在PATH/myproject/下创建该模块,然后在该模块下创建tasks.py,把我们的耗时程序写进去。
1
2
3
4
5
6
7
8
9
|
from myproject import celery_app
import time
@celery_app .task
def time_consuming_fun():
for i in range ( 5 ):
time.sleep( 1 )
print (i)
return 'ok'
|
直接用我们的celery_app下的task方法装饰需要进行异步处理的函数即可。
三、调用异步函数。
在view中调用,这里用的是Django的类视图。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from celery_tasks.tasks import time_consuming_fun
from django.views import View
from django.http import JsonResponse
# Create your views here.
class MyView(View):
def get( self ,request):
#异步调用
time_consuming_fun.delay()
#直接调用
#time_consuming_fun()
return JsonResponse({ 'msg' : 'ok' , 'code' : 200 })
|
配置好url即可。
四、启动celery。
在项目根目录下,即managy同级文件目录下,输入命令:
celery -A myproject worker -l info
此时celery在终端窗口运行,关闭终端celery就会停止。
输入命令
1
|
celery multi start w1 - A myproject - l info - - logfile = celerylog.log - - pidfile = celerypid.pid
|
此时celery为守护进程,日志记录在celerylog.log里。
日志文件可以指定路径PATH/celerylog.log,此时会在指定路径下创建日志文件。进程号文件类似。
停止或重启将开始换为stop或restart即可,所以需记录w1,即需记录woker的名称来方便重启和停止。
补充:Django项目后台不挂断运行
方法一:
1、进入项目目录下,运行下面程序:
1
|
nohup python manage.py runserver 0.0 . 0.0 : 5008 &
|
nohup(no hang up)用途:不挂断的运行命令
&用途:在后台运行
1
|
nohup / root / start.sh &
|
在shell中回车后提示:
1
|
[~]$ appending output to nohup.out
|
原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
注意:在nohup执行成功后直接点击关闭程序按钮关闭终端,会断掉该命令对应的session,导致nohup对应的进程被通知一起shutdown。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。
方法二:这个比较高级,使用screen
1、安装screen
1
|
yum install - y screen
|
2、新建一个screen
1
|
screen - S xiedi
|
这样会新开一个窗口,然后执行命令即可
1
|
python manage.py runserver 0.0 . 0.0 : 9000
|
3、重开一个窗口,列出所有screen进程,如下
1
2
3
|
[root@docker ~] # screen -ls
There are screens on:
3029.xiedi (Attached)
|
4、如果想链接上这个会话,执行命令即可
1
|
screen - r 3029
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://xudongyang.blog.csdn.net/article/details/80882866