Celery从入门到放弃

本文介绍了Celery异步任务队列,它分为worker、broker和主类三部分。详细说明了其使用方法,包括单独脚本调用、项目方式、django - celery模式等,还提及安装、配置、启动服务、指定队列名、调整worker进程数及管理任务状态等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义:

    Celery是一个异步的任务队列(也叫做分布式任务队列)


2.工作结构

    Celery分为3个部分

    (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代码,当然还包括python调用系统工具功能)

    (2)broker部分负责任务消息的分发以及任务结果的存储,这部分任务主要由中间数据存储系统完成,比如消息队列服务器RabbitMQ、redis、

Amazon SQS、MongoDB、IronMQ等或者关系型数据库,使用关系型数据库依赖sqlalchemy或者django的ORM

    (3)Celery主类,进行任务最开始的指派与执行控制,他可以是单独的python脚本,也可以和其他程序结合,应用到django或者flask等web框架里面以及你能想到的任何应用


3.话不多说,用起来

    (1)安装Celery(要安装celery3版本,4版本改动较大没测试)

#pip install celery==3.1.17

    (2)broker部分此处使用安装好的redis服务6380端口的db0作为消息队列,普通redis服务的安装此处不做介绍

  (3)Celery的使用一(单独脚本调用,简单方便)

        #注:不考虑任务的结果存储情况

         <1>/tmp/tasks.py(实际脚本中不要写中文注释)

#!/usr/bin/env python

# -*- coding=utf-8 -*-

from celery import Celery

from celery import platforms

#用于开启root也可以启动celery服务,默认是不允许root启动celery的

platforms.C_FORCE_ROOT = True

#创建一个celery实例,传递进去的第一个参数tasks必须是本文件的文件名tasks,指定broker为本机redis6380服务

celery = Celery('tasks', broker='redis://localhost:6380/0')

#使用celery实例的task装饰器装饰add函数,此处的add函数可以当作后期的耗时任务对待

@celery.task

def add(x,y):

    return x + y

       <2>启动celery服务

#cd /tmp

#celery -A tasks worker --loglevel=info

       <3>验证执行任务

       #导入模块,执行add函数,此处使用add.delay(3,4)而不是add(3,4),因为被celery封装了,要异步执行需要额外使用add.delay(3,4)

       #需要注意,如果把返回值赋值给一个变量,那么原来的应用程序也会被阻塞,需要等待异步任务返回的结果。因此,实际使用中,不需要把结果赋值。

#cd /tmp

#python

>>>from tasks import add

>>>add.delay(3,4)

       #celery服务的窗口会刷出任务的信息,以及是否处理成功,以及结果

       #将来只要在别的程序中引入tasks中的add函数,就是异步的了,是不是有点屌。。。。。

       <4>扩展知识,指定队列名

       传入redis中的指定队列testq怎么玩?(其他broker引擎也支持)

       启动celery服务的时候添加额外参数-Q '队列名'

#cd /tmp

#celery -A tasks.tasks worker --loglevel=info -Q 'testq'

       跑任务的时候指定testq队列名

#cd /tmp

#python

>>>from tasks import add

>>>add.delay(3,4,queue='testq')

       <5>扩展知识,指定开启的worker进程数(底层是调用的Python的multiprocessing模块中的Pool进程池思想来做)

       -c 5 开启5个worker进程来同时抢任务,跑任务

#cd /tmp

#celery -A tasks.tasks worker --loglevel=info -c 5

       <6>扩展知识,管理broker里面的数据,查看任务状态,以及任务的详细信息

       安装一个叫flower的webui,提供任务查询,worker生命管理,以及路由管理等(底层是通过tornado框架封装的)

#pip install flower

#任意目录下执行都可以

#celery flower --port=5555 --broker=redis://localhost:6380/0

       #里面可以看到任务参数,结果,接受任务时间,任务开始时间,任务状态,Started是任务进行中,Success是任务跑完执行成功

    (4)Celery的使用二(项目方式,也叫做Python包方式,结构清晰,低耦合;相比纯脚本方式略复杂,用不用由你)

    创建一个叫做proj的Python包(创建Python包的操作此处不做详细说明,tree /tmp/proj)

 

       <1>proj/celery.py

      #from __future__ import absolute_import据说添加此行可以低降低出错的概率哦(阿门保佑;其实就是兼容Python版本的一个东东)

      #创建一个celery的实例,名字叫做app,传递进去的第一个参数是Python包的名字,include加载任务文件,config_from_object指定celery的配置文件(好吧,看起来比单纯使用脚本方式麻烦点,请继续往下看)

#!/usr/bin/env python

# -*- coding=utf-8 -*-

from __future__ import absolute_import

from celery import Celery

app = Celery('proj', include=['proj.tasks'])

app.config_from_object('proj.config')

if __name__ == '__main__':

    app.start()

       <2>proj/config.py

       #配置文件里指定broker

#!/usr/bin/env python

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

from __future__ import absolute_import

BROKER_URL = 'redis://127.0.0.1:6380/0'

       <3>proj/tasks.py

       #导入celery实例,实例绑定任务

#!/usr/bin/env python

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

from __future__ import absolute_import

from proj.celery import app

@app.task

def add(x, y):

    return x + y

       <4>开启celery服务(特定目录指定包名字启动)

#cd /tmp/

#celery -A proj worker -l info

       <5>扩展功能,指定队列名,调整worker进程数,页面管理celery同上,不再做说明

 (5)Celery的使用三(django-celery模式;#反正我喜欢用这种

       django调用celery跑异步任务,常见场景有注册成功,发送邮件可以异步来防止网络IO阻塞,以及耗时间的任务,例如需要去跑9000台IP的某些配置参数任务,或者下发任务执行,可能需要10几分钟才能跑完,就可以WEB应用中使用这种异步方式

       <1>安装django-celery软件包

       #一定要注意celery的版本和django-celery的小版本要保持一致,否则会有各种杂七杂八的小问题(都是泪.......)

#pip install celery==3.1.17

#pip install django-celery==3.1.17

       <2>创建celery必须的数据库表结构

#cd Python_20161203

#python manage.py migrate

       <3>django项目的settings.py文件中追加如下内容;app呢是django项目里面的应用名字

       settings.py

import djcelery

djcelery.setup_loader()

BROKER_URL = 'redis://127.0.0.1:6380/0'

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6380/1'

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

CELERY_ACCEPT_CONTENT = ['json']

CELERY_IMPORTS = ('app.tasks', )

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

CELERYD_CONCURRENCY = 20

参数说明(可以根据自己的需求添加自己的参数):

CELERY_RESULT_BACKEND = "redis://127.0.0.1:6380/1'" #结果存储

CELERY_TASK_RESULT_EXPIRES = 1200 # celery任务执行结果的超时时间,我的任务都不需要返回结果,只需要正确执行就行

CELERYD_CONCURRENCY = 20 # celery worker的并发数 也是命令行-c指定的数目,事实上实践发现并不是worker也多越好,保证任务不堆积,加上一定新增任务的预留就可以

CELERYD_PREFETCH_MULTIPLIER = 4 # celery worker 每次去redis取任务的数量,我这里预取了4个慢慢执行,因为任务有长有短没有预取太多

CELERYD_MAX_TASKS_PER_CHILD = 200 # 每个worker执行了多少任务就会死掉,我建议数量可以大一些,比如200

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 这是使用了django-celery默认的数据库调度模型,任务执行周期都被存在你指定的orm数据库中

 

       <4>app/tasks.py(在django的app应用目录下创建tasks.py任务文件,里面调用复杂的任务函数)

#!/usr/bin/env python

# -*- coding=utf-8 -*-

###############################

from __future__ import absolute_import

from celery import task

import time

#task装饰器封装了celery函数,为耗时的操作

@task

def add(x,y):

    for i in range(30):

       print i

       time.sleep(1)

    return x + y

       <5>添加验证功能,查看实际效果

       app/urls.py

urlpatterns = [

url(r'^celery_test/,views.celery_test),

]

       app/views.py

def celery_test(request):

    from tasks import add

    add.delay(4,8)

    return HttpResponse('Celery testing666')

       <6>开启djanog服务和celery服务(虽然耦合了,但是还是需要额外开启)

#python manage.py runserver 0.0.0.0:8000

#另一个窗口开启celery服务

#python manage.py celery worker --loglevel=info

 

       <7>发送http的GET请求,调用celery去执行异步任务(大功告成)

curl http://127.0.0.1:8000/index/celery_test/

        celery那端的屏幕输出如下:

[2016-12-01 16:16:00,940: INFO/MainProcess] Received task: app.tasks.add[06a8d603-a7d3-4732-b8f3-ad010d531200]

[2016-12-01 16:16:00,941: WARNING/Worker-1] 0

[2016-12-01 16:16:01,943: WARNING/Worker-1] 1

[2016-12-01 16:16:02,945: WARNING/Worker-1] 2

[2016-12-01 16:16:03,947: WARNING/Worker-1] 3

[2016-12-01 16:16:04,948: WARNING/Worker-1] 4

[2016-12-01 16:16:05,950: WARNING/Worker-1] 5

[2016-12-01 16:16:06,952: WARNING/Worker-1] 6

[2016-12-01 16:16:07,954: WARNING/Worker-1] 7

[2016-12-01 16:16:08,955: WARNING/Worker-1] 8

[2016-12-01 16:16:09,957: WARNING/Worker-1] 9

[2016-12-01 16:16:10,958: WARNING/Worker-1] 10

[2016-12-01 16:16:11,959: WARNING/Worker-1] 11

[2016-12-01 16:16:12,961: WARNING/Worker-1] 12

[2016-12-01 16:16:13,962: WARNING/Worker-1] 13

[2016-12-01 16:16:14,964: WARNING/Worker-1] 14

[2016-12-01 16:16:15,964: WARNING/Worker-1] 15

[2016-12-01 16:16:16,966: WARNING/Worker-1] 16

[2016-12-01 16:16:17,968: WARNING/Worker-1] 17

[2016-12-01 16:16:18,969: WARNING/Worker-1] 18

[2016-12-01 16:16:19,971: WARNING/Worker-1] 19

[2016-12-01 16:16:20,973: WARNING/Worker-1] 20

[2016-12-01 16:16:21,974: WARNING/Worker-1] 21

[2016-12-01 16:16:22,976: WARNING/Worker-1] 22

[2016-12-01 16:16:23,978: WARNING/Worker-1] 23

[2016-12-01 16:16:24,979: WARNING/Worker-1] 24

[2016-12-01 16:16:25,981: WARNING/Worker-1] 25

[2016-12-01 16:16:26,982: WARNING/Worker-1] 26

[2016-12-01 16:16:27,984: WARNING/Worker-1] 27

[2016-12-01 16:16:28,986: WARNING/Worker-1] 28

[2016-12-01 16:16:29,987: WARNING/Worker-1] 29

[2016-12-01 16:16:30,990: INFO/MainProcess] Task app.tasks.add[06a8d603-a7d3-4732-b8f3-ad010d531200] succeeded in 30.049149203s: 12

    (6)Celery的使用四(celery模式;#反正我不喜欢用,那索性不写了,想学习的点击下面的链接去自助学习吧,加油少年

不安装django-celery版本使用方法



 

<think>嗯,用户想让我以专业培训师的角度给新手如何快速高效学习Python提建议。首先,我需要明确用户的需求。他们可能刚入门,对Python的学习路径不太清楚,需要一些结构化的指导。用户可能希望得到具体的步骤、资源推荐以及常见陷阱的避免方法。 接下来,我要考虑用户的身份。可能是学生、转行者或职场新人,他们时间有限,想要高效学习。因此,建议需要强调基础的重要性,同时也要有实践项目,保持学习动力。另外,新手可能容易陷入理论过多而实践不足的误区,所以需要提醒他们多动手。 然后,用户可能没有明确提到的深层需求是持续学习的支持和社区资源。他们可能在遇到问题时不知道如何解决,所以推荐一些社区和交流平台会很有帮助。同时,学习计划的部分也很重要,帮助他们合理安排时间,避免半途而废。 还要考虑学习中的常见问题,比如环境配置、错误处理、代码规范等。这些细节对于新手来说可能比较棘手,需要给出具体的建议,比如使用在线环境避免初期配置困难,或者使用工具检查代码规范。 最后,保持动力和长期规划是关键。新手可能会因为短期看不到成果而放弃,所以建议中需要包括如何设定小目标,参与项目,以及后续的学习方向,比如数据分析或Web开发,帮助他们看到未来的可能性。 总结一下,结构应该包括基础、实践、工具、计划、社区、错误处理、代码规范和长期规划。每个部分都要简洁明了,提供实用资源和具体方法,确保新手能快速上手并持续进步。</think>作为专业Python培训师,以下是我为新学习者提供的系统性学习建议,结合多年教学经验总结的高效路径: ### 一、构建认知框架(1-2周) 1. **语言定位**:明确Python在自动化、数据分析、Web开发等领域的应用优势 2. **环境配置**: - 新手推荐使用Google Colab/Jupyter Notebook避免环境困扰 - 语法规范(Syntax) - 编程范式(面向对象/函数式) - 标准库生态(内置模块体系) ### 二、分层学习路径 **阶段1:核心语法(3周)** - 每日代码量:50行起步 - 重点突破: ```python # 典型难点示例 list_comprehension = [x**2 for x in range(10) if x%2 ==0] generator = (x for x in range(1000000)) # 理解迭代器协议 ``` - 工具链: ```bash pip install black flake8 # 代码格式化与静态检查 ``` **阶段3:领域专项(按需选择)** - Web开发:Flask/Django框架 → REST API设计 - 自动化运维:Paramiko/Fabric → 任务调度(Celery) ### 三、高效实践策略 1. **刻意练习法**: - 每日完成10个Codewars 5-6kyu题目 - 每周重构旧代码提升可读性 2. **项目驱动学习**: - 初级:豆瓣电影数据爬取+分析 - 中级:使用FastAPI构建TODO API - 高级:基于OpenCV的简单图像处理工具 ### 四、关键学习工具 | 工具类型 | 推荐工具 | 使用场景 | |----------------|--------------------------|--------------------------| | 在线练习 | Codecademy/夜曲编程 | 语法基础巩固 | | 调试工具 | Python Debugger (pdb) | 复杂逻辑追踪 | | 文档查询 | Dash/Zeal | 离线API速查 | | 协同开发 | Git + GitHub | 版本控制与代码托管 | ### 五、避免常见误区 1. **过早追求"Pythonic"写法**:先确保可读性再优化 2. **忽视异常处理**:至少掌握try-except-finally结构 3. **重复造轮子**:善用PyPI现有库(安装前检查维护状态和License) ### 六、学习节奏控制 - 每日投入:建议2小时(0.5h理论+1.5h实践) - 周计划示例: ``` 周一:函数与模块 周三:OOP概念实现 周五:第三方库实战 周日:项目日(累计10小时完成小项目) ``` ### 七、效果评估体系 1. 基础能力检验: - 能独立编写命令行计算器 - 实现CSV数据清洗脚本 2. 进阶标准: - 通过Python Institute的PCAP认证考试 - 在GitHub拥有3个star数超过10的项目 建议配合Trello/Kanban进行学习进度管理,保持每周代码提交记录。遇到技术卡点时,优先查阅官方文档(docs.python.org),其次参考Real Python等优质技术博客。坚持6个月系统学习后,可达到企业初级开发岗位的技术要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值