Python+Django+celery+rabbitmq异步任务

目录

1.Docker安装Rabbitmq

2.安装celery,djcelery

3.安装django,配置 文件


1.Docker安装Rabbitmq

# 创建rabbitmq容器
docker run -d --name=rabbitmq -p 10:15672 -p 11:5672 --restart unless-stopped -v /rabbitmq:/root rabbitmq:latest
# 进入容器
docker exec -it rabbitmq bash
# 配置rqbbitmq
rabbitmq-plugins enable rabbitmq_management
# 退出容器
# 浏览器打开rabbitmq网页(对应端口15672)
# 默认密码账号都是guest

2.安装celery,djcelery

pip install celery
pip install djcelery

3.安装django,配置 文件

1.setting文件中


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
       ...
    'djcelery',# 注册djcelery
]

# 设置mq为消息队列
import djcelery
# 初始化加载
djcelery.setup_loader()

# 设置代理人broker(5672为服务连接端口,15672为浏览器页面连接端口)
BROKER_URL = 'amqp://guest:[email protected]:5672'
# 设置结果存储位置
CELERY_RESULT_BACKEND = 'amqp://guest:[email protected]:5672'


# 可以配置定时任务(需要的话)

CELERYBEAT_SCHEDULE = {
    # 定时任务一: 每24小时周期执行任务(test)
    u'定时任务1': {
        "task": "app.tasks.test",
        "schedule": crontab(hour='*/24'),
        "args": (),
    },
    # 定时任务二: 每天的凌晨12:30分,执行任务(test)
    u'定时任务2': {
        'task': 'app.tasks.test',
        'schedule': crontab(minute=30, hour=0),
        "args": ()
    },
    # 定时任务三:每个月的1号的6:00启动,执行任务(test)
    u'定时任务3': {
        'task': 'app.tasks.test',
        'schedule': crontab(hour=6, minute=0, day_of_month='1'),
        "args": ()
    },
}

2.需要写异步任务的app文件下,和views.py同级新建tasks.py(必须这个名字和位置)

# coding : utf-8
from time import sleep
from celery import task
from celery import Celery, platforms
platforms.C_FORCE_ROOT = True
global server


@task
def test(num, **kwargs):
    # 这里写耗时任务
    sleep(3)
    print('这是消费的第%s个任务' % num)

 3.在views.py里面调用异步任务(相当于将耗时任务塞进rabbitmq消息队列)

from user.tasks import test

Num = 0

class Test(APIView):
    authentication_classes = []

    def get(self, request, *args, **kwargs):
        job_name = 'test1'
        global Num
        Num += 1
        # 生成异步任务
        res = test.delay(Num)
        print(res, '这是生产的第%s个任务' % Num)
        eta = datetime.utcnow() + timedelta(seconds=10)
        # 生成异步延时任务
        res1 = test.apply_async((job_name,), eta=eta)
        print(res1, '这是生产的第%s个延时任务' % Num)
        # 定时任务写在setting里面即可
        return Response({'code': 0, 'msg': 'success'})

你可能感兴趣的:(rabbitmq,分布式,django,python)