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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Python编程:Celery执行异步任务和定时任务

Celery

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

1、简介

1、异步任务 耗时操作异步执行

2、定时任务 类似crontab

d2.1.jpg

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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
机器学习/深度学习 人工智能 数据可视化
Python:探索编程之美
Python:探索编程之美
9 0
|
1天前
|
机器学习/深度学习 人工智能 数据处理
Python编程的魅力与实践
Python编程的魅力与实践
|
2天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
8天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
8天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
9天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
21 0
|
消息中间件 存储 SQL
万字总结!Python 实现定时任务的八种方案(下)
万字总结!Python 实现定时任务的八种方案(下)
693 0
万字总结!Python 实现定时任务的八种方案(下)
|
存储 NoSQL Java
万字总结!Python 实现定时任务的八种方案(上)
万字总结!Python 实现定时任务的八种方案
2361 0
万字总结!Python 实现定时任务的八种方案(上)
|
15天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。