python celery 模块
admin
2023-07-15 23:02:32
0

Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度
python celery 模块
Celery是典型的生产生-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)
1.编写任务代码task.py
from celery import Celery

app = Celery('tasks',broker='amqp://guest@localhost//', backend='redis://localhost:6379/0')

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

当函数使用”@app.task”修饰后,即为可被Celery调度的任务
2.启动workers 命令 celery worker -A tasks --loglevel=info --concurrency=5
3.调用任务

result=add.delay(2, 5)
result.ready()
result.get(timeout=1)

4.配置文件
单个参数配置:
app.conf.CELERY_BROKER_URL = 'amqp://guest@localhost//'
app.conf.CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
多个参数配置:
app.conf.update(
CELERY_BROKER_URL = 'amqp://guest@localhost//',
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
)

从配置文件中获取:

先把配置存入配置文件中'celeryconfig.py'

BROKER_URL='amqp://guest@localhost//'
CELERY_RESULT_BACKEND='redis://localhost:6379/0'

导入到celery 对象中app.config_from_object('celeryconfig')
我们之前调用任务使用了”delay()”方法,它其实是对”apply_async()”方法的封装,
使得你只要传入任务所需的参数即可
关于序列化
Celery默认序列化方式是”json”,指定序列化
app = Celery('tasks', broker='...', task_serializer='yaml')

app.conf.update(
CELERY_TASK_SERIALIZER='pickle',
CELERY_RESULT_SERIALIZER='json',
)

@app.task
def add(x, y):
...

add.apply_async((2, 5), serializer='json')


django + celery 实现任务的异步处理
1.Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 -- http handling(request解析) -- url mapping(url正则匹配找到对应的View) -- 在View中进行逻辑的处理、数据计算(包括调用Model类进行数据库的增删改查)--将数据推送到template,返回对应的template/response
同步请求:所有逻辑处理、数据计算任务在View中处理完毕后返回response。在View处理任务时用户处于等待状态,直到页面返回结果
异步请求:View中先返回response,再在后台处理任务。用户无需等待,可以继续浏览网站。当任务处理完成时,我们可以再告知用户
2.建立消息队列
消息队列可以使用RabbitMQ、Redis 等
3.安装django-celery
pip install celery django-celery
4.配置settings.py
import djcelery
djcelery.setup_loader()
BROKER_URL = 'django://' # 使用django做broker
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务.
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' # 需要跟踪任务的状态时保存结果和状态
CELERY_ENABLE_UTC = False # 不用UTC.
CELERY_TIMEZONE = 'Asia/Shanghai' # 指定上海时区
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] # 允许的格式
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = True

INSTALLED_APPS = [
'djcelery',# 新增
'kombu.transport.django', # 新增kombu.transport.django则是基于Django的broker
]

其中,当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task
5.在项目 mysite 下新建celery.py
from future import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
from django.conf import settings # noqa
app = Celery('mysite')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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

6.在应用celery_project下新建tasks.py

from future import absolute_import
from celery import shared_task
import time

@shared_task(track_started=True)
def add(x, y):
time.sleep(30)
return x + y

在tasks.py中我们就可以编码实现我们需要执行的任务逻辑,在开始处import task,然后在要执行的任务方法开头用上装饰器@task。需要注意的是,与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名
6.生产任务
在需要执行该任务的View中,通过test.delay的方式来创建任务,并送入消息队列
def produce():
a =1
b =2
r = test.delay(a,b)
7.启动work
#先启动服务器 python manage.py runserver
#再启动worker celery worker -A mysite -c 4 --loglevel=info

相关内容

热门资讯

特朗普:正致力于与伊朗达成协议... 特朗普在《纽约邮报》一档播客访谈节目中称,他正与伊朗磋商一项协议,伊朗已同意不再谋求拥有核武器。他表...
不接壤的日菲为何偷划海界? 日菲近日发表联合声明,宣称就“划定两国专属经济区和大陆架的海洋边界”启动正式谈判。两个隔海相望的国家...
凤凰晚报丨从钳工到老戏骨,魏宗... 今日人物【从钳工到老戏骨,魏宗万用一生诠释“戏比天大”】6月1日,表演艺术家魏宗万在上海逝世,享年8...
科威特称伊朗袭击致63人受伤 科威特卫生部门3日称,伊朗当天对科威特的袭击已造成63人受伤,相关部门已启动紧急应对预案,并在全国范...
日本标榜“和平国家”却行扩军备... 今年是东京审判开庭80周年,世界正回望历史、反思战争罪责、捍卫二战后来之不易的国际秩序之际,日本却迈...
浙江杨梅即将大规模上市,如何破... “我们现在的压力很大。”5月底,浙江余姚杨梅产区丈亭镇副镇长林宇站在一片杨梅林前对第一财经表示,当地...
致5死2伤!韩国就韩华航空航天... 【环球网报道 记者 姜蔼玲】据韩联社6月1日报道,针对位于韩国大田的韩华航空航天公司发生爆炸致7人伤...
黄河科技学院2026年招生简章 长按图片识别二维码或点击 “阅读原文” 查看电子招生简章。
医路起航,从“心” 开始!黄河... 6月1日上午,黄河科技学院附属医院2022级临床医学本科实习生入院岗前培训在大医讲堂顺利举办。院领导...
问题居然在实体卡槽上!美版iP... 6月2日消息,日前,又有博主提前把还没发布的iPhone 18 Pro电池参数给曝光了出来,根据爆料...