Python编程:Celery执行异步任务和定时任务

版权声明:本文为博主原创文章,欢迎转载,请注明出处 https://blog.csdn.net/mouday/article/details/88076910

Celery

文档:http://docs.celeryq.org/en/latest/index.html#

1、简介

1、异步任务 耗时操作异步执行
2、定时任务 类似crontab
在这里插入图片描述

2、安装

1、安装pyhton版本管理工具
pyenv pyenv-virtualenv

2、安装虚拟环境管理工具
virtualenv virtualenvwrapper

3、安装模块

pip install celery[redis]

4、安装消息中间件
RabbitMQ / Redis

3、单文件使用

1、编写函数celery_app.py


from celery import Celery
import time

broker = "redis://localhost:6379/1"
backend = "redis://localhost:6379/2"
app = Celery("my_task", broker=broker, backend=backend)


@app.task(name="task")
def add(a, b):
    print("coming...")
    time.sleep(5)
    return a + b


if __name__ == '__main__':
    result = add(1, 2)
    print(result)

2、启动worker

$ celery worker -A celery_app -l INFO

参数:
A: app文件名称
l:日志级别

3、启动任务

> from celery_app import add
> result = add.delay(3, 4)
> result.ready()
> result.get()

4、工程化使用

目录结构

├── app.py
└── celery_app
    ├── __init__.py
    ├── celeryconfig.py
    ├── task1.py
    └── task2.py

实例化Celery __init__.py

# -*- coding: utf-8 -*-

from celery import Celery

app = Celery(__file__)

# 加载配置模块
app.config_from_object("celery_app.celeryconfig")

配置文件 celeryconfig.py

# -*- encoding:utf-8 -*-

# celery配置文件

BROKER_URL = 'redis://localhost:6379/1'

CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'

# 设置时区,默认UTC
CELERY_TIMEZONE = 'Asia/Shanghai'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True

# 导入指定的任务模块
CELERY_IMPORTS = (
    "celery_app.task1",
    "celery_app.task2"
)

任务文件 task1.py

# -*- coding: utf-8 -*-

import time
from celery_app import app


@app.task
def add(x, y):
    time.sleep(3)
    return x + y

任务文件 task2.py

# -*- coding: utf-8 -*-

import time
from celery_app import app


@app.task
def multiply(x, y):
    time.sleep(5)
    return x * y

启动worker

$ celery worker -A celery_app -l INFO

5、定时任务

可以直接配置到配置文件中 celeryconfig.py


from datetime import timedelta

from celery.schedules import crontab

# 设置定时任务
CELERYBEAT_SCHEDULE = {
    "task1": {
        "task": "celery_app.task1.add",
        "schedule": timedelta(seconds=10),
        "args": (2, 8)
    },
    "task2": {
        "task": "celery_app.task1.add",
        "schedule": crontab(hour=14, minute=59),
        "args": (2, 8)
    }
}

启动定时任务

$ celery beat -A celery_app -l INFO

celery 4.1.0 时区bug -> 4.0.2

一条命令启动异步任务和定时任务

$ celery -B -A celery_app worker -l INFO

没有更多推荐了,返回首页