celery异步定时任务 Django rest framework配置

做项目时遇到一个需要定时启动特定任务的需求,记录下从配置到在服务器中启动完成需求的全程。
1.下载安装:

apt-get install rabbitmq-server
pip install celery

2.配置:
在settings中加入如下代码:

CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']  #接受的文件类型
CELERYD_MAX_TASKS_PER_CHILD = 10  #每个worker执行多少次任务后死亡,防止内存泄漏用的

在settings的同级目录下新建celery.py文件,进入后输入以下代码:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from celery.schedules import crontab
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名称.settings')

app = Celery('你的项目名称')

# 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()     

# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True

#以下是定时任务模块,可以添加一个或多个定时任务, 如只是部署异步任务,可以把这段代码注释掉
app.conf.update(
    CELERYBEAT_SCHEDULE = {
        '任务名称(自定义)': {
            'task': '你的项目app.tasks.你要执行的脚本或代码函',  # 这个task任务在app下的tasks.py文件内
            'schedule':  timedelta(seconds=几秒),
            'args': (想传的参数)#不传参也可去除此项
        },
        '任务名称(自定义)': {
            'task': '你的项目app.tasks.你要执行的脚本或代码函数', # 这个task任务在app下的tasks.py文件内
            'schedule': crontab(hour=几点, minute=几分),
            'args': (想传的参数)#不传参也可去除此项
        }
    }
)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

以上代码添加完后,需要去你的app下新建一个tasks.py文件(名字必须要是tasks,不能随意修改),在tasks文件中写入你要执行的代码函数

from __future__ import absolute_import

import os
from datetime import datetime, timedelta

from celery import shared_task
from django.http import HttpResponse

from system.models import LogVisitTimes, TotalVisitTimes

#函数如果需要传参,那么在celery.py下的定时任务模块中添加args项。
@shared_task
def 函数(传参):
    return 返回值

@shared_task
def 函数(传参):
    return 返回值

#可以写多个

然后在此app下的views.py文件中调用下tasks.py里的函数,添加如下代码:

from .tasks import 函数1, 函数2

def post(request):
    result1 = 函数1.delay(可传参)  #加上delay()表示开启异步执行   
    result2 = 函数2(可传参)  #不开启异步执行,

到此,项目中的异步或者定时任务或者异步定时任务就配置完成了
接下来是执行阶段:
在终端中进入到你的项目目录下,输入如下命令:

sudo rabbitmq-server -detached   #开启 rabbitmq服务
celery -A 你的项目名称 worker -l info --beat  开启定时任务

如果一切顺利那么会显示如下


image.png

注:出现的这个warning是因为我项目还在开发阶段,所settings中DEBUG设置为True,可设置为False。

这样的话,在本地配置和执行都没有问题了,再接下来就是如何在服务器中运行这个定时任务,这里用到screen会话,大部分服务器上都是自带screen会话功能的。

把项目部署到服务器上去后,或者服务器更新git了你写的代码,终端执行如下操作:

screen -S 随意命名(但请记住这个名字)

按下回车后虽然屏幕上变化不大,但是其实已经是screen会话中了,进入你的项目目录下,执行如下操作:

celery -A 你的项目名称 worker -l info --beat

之后会出现和本地运行时一样的一段提示,那么就全部OK了。
如果你是用xshell进入服务器操作的,那么你可以关上窗口了。
下次要再进入这个screen窗口,只需要screen -ls 查看已有的会话,然后screen -r 窗口名称,就可以重新进入会话窗口,screen -X -S 会话进程编号 quit,可以退出并删除该会话。
-----完

参考:screen相关https://www.cnblogs.com/ywl925/p/3604530.html
异步定时任务相关https://blog.csdn.net/weixin_42578481/article/details/81047030

你可能感兴趣的:(celery异步定时任务 Django rest framework配置)