使用celery之怎么让celery跑起来
celery 官网帮助文档 http://docs.celeryproject.org/en/latest/index.html
前言
自从发了上次的文章使用celery之深入celery配置, 有一些网友再问我怎么让celery跑起来. 其实说来也是,celery在新手眼里真的是比较重量级,不好懂,今天先让他跑起来吧 本文大部分代码和使用方法都可以在celery官网看到
我想要的效果
我想实现一个定时任务, 每3个小时的12分启动,假如是定时任务大概是这样的:
- 12 */3 * * * python /where/is/the/path/that.py
选择MQ
使用消息队列其实就是为了给任务一个时序,保证任务消息不丢失,想想你的一个任务是关乎公司核心业务,犹豫某种原因失败或者丢失怎么办? celery就需要这个消息的存储,我这里还是选择rabbitmq mongodb,redis都无所谓 只是存储的位置的问题. 选择其他的工具没有远程控制和监控
写法就是:
- BROKER_URL = 'amqp://myuser:mypassword@localhost:5672/vhost'
其中可以这样解析
- amqp://user:password@hostname:port/vhost
vhost是命名空间,就像网站的子域名,在这里由于权限控制我们需要先创建账号和密码
- $ rabbitmqctl add_user myuser mypassword
- $ rabbitmqctl add_vhost myvhost
- $ rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
编写tasks.py脚本
- from celery import Celery
- app = Celery('tasks', broker='amqp://myuser:mypassword@localhost:5672/vhost')
- @app.task
- def add(x, y):
- return x + y
#### 简单的使用
- $celery -A tasks worker --loglevel=debug
-A指定的就是任务的程序 tasks.py worker表示他是一个执行任务角色. 后面的记录日志类型,默认是info
这个时候,你可以在当前目录下使用python交互模式生成一个任务
- >>> from tasks import add
- >>> add.delay(4, 4)
这个时候可以看见上面的日志里面多了一些消息,然后里面多了这个任务的信息,比如下面这样:
- [2013-11-24 17:11:59,369: INFO/MainProcess] Received task: tasks.add[f27994b0-3628-43a1-b136-540a360e3d64]
- [2013-11-24 17:11:59,371: INFO/MainProcess] Task tasks.add[f27994b0-3628-43a1-b136-540a360e3d64] succeeded in 0.00102571400021s: 8
可以看见你的任务被执行了
假如我使用python的包, 就像一个应用,让代码结构化一些
- $tree proj
- proj
- ├── __init__.py
- ├── celery.py
- └── tasks.py
- $cat proj/celery.py
- from __future__ import absolute_import
- from celery import Celery
- app = Celery('proj',
- broker='amqp://myuser:mypassword@localhost:5672/vhost',
- backend='amqp://',
- include=['proj.tasks'])
- app.conf.update(CELERY_TASK_RESULT_EXPIRES=3600,)
- if __name__ == '__main__':
- app.start()
上面的broker就是消息存储的地址 backend是存储任务执行情况的,比如正在执行,执行失败, 已经执行结果.include表示执行的任务的代码都放在哪个程序里面,比如这里的proj.tasks就是proj/tasks.py
- $cat proj/tasks.py
- from __future__ import absolute_import
- from proj.celery import app
- @app.task
- def add(x, y):
- return x + y
其中的app.task是一个装饰器, 你可以在tasks.py里面加很多函数,但是celery只会找带这个装饰器的函数当成一种任务去执行 你可以有多个这样的脚本,只要在上面的celery.py的include的列表中指定
好吧 我们可以这样启动
- $celery worker --app=proj -l info
proj 就是我们刚才应用的项目目录
给我们的项目任务放到特定的队列
可能你有很多的任务,但是你希望某些机器跑某些任务, 你可以希望有些任务优先级比较高,而不希望 先进先出的等待. 那么需要引入一个队列的问题. 也就是说在你的broker的消息存储里面有一些队列,他们并行运行,但是worker只从对应 的队列里面取任务.
我们要修改配置
- $cat proj/celery.py
- from __future__ import absolute_import
- from celery import Celery
- app = Celery('proj',
- broker='amqp://myuser:mypassword@localhost:5672/vhost',
- backend='amqp://',
- include=['proj.tasks'])
- app.conf.update(
- CELERY_ROUTES = {
- 'proj.tasks.add': {'queue': 'hipri'},
- },
- )
- if __name__ == '__main__':
- app.start()
- celery -A proj worker -Q hipri #这个worker只处理hipri这个队列的任务
你会发现add这个函数任务被放在一个叫做’hipri’的队列里面,想要执行那么也需要改:
- from proj.tasks import add
- add.apply_async((2, 2), queue='hipri')
使用beat自动调度
想想吧. 目前还是交互模式去手动执行, 我们要是想crontab的定时生成和执行,那么就是celery beat干的事情
- from __future__ import absolute_import
- from datetime import timedelta
- from celery import Celery
- app = Celery('proj',
- broker='amqp://myuser:mypassword@localhost:5672/vhost',
- backend='amqp://',
- include=['proj.tasks'])
- app.conf.update(
- CELERY_ROUTES = {
- 'proj.tasks.add': {'queue': 'hipri'},
- },
- CELERYBEAT_SCHEDULE = {
- "add": {
- "task": "proj.tasks.add",
- "schedule": timedelta(seconds=10),
- "args": (16, 16)
- }, },
- )
- if __name__ == '__main__':
- app.start()
注意发现了一个CELERYBEAT_SCHEDULE,里面的调度其实就是表示10秒生成一次,worker启动方法一样, 这里启动beat,他就是按时生成任务发到MQ里面,让worker取走去执行
- celery -A proj beat
其实也可以在worker命令中加-B
- celery -A proj worker -B -Q hipri -l debug
刚才的CELERYBEAT_SCHEDULE也可以使用crontab的风格,比如我说的没3小时的12分就可以这样:
- from celery.schedules import crontab
- CELERYBEAT_SCHEDULE = {
- "add": {
- "task": "tasks.add",
- "schedule": crontab(hour="*/3", minute=12),
- "args": (16, 16),
- },
- }
参考: http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
转载自:http://www.dongwm.com/archives/how-to-use-celery/
使用celery之怎么让celery跑起来的更多相关文章
- Python3安装Celery模块后执行Celery命令报错
1 Python3安装Celery模块后执行Celery命令报错 pip3 install celery # 安装正常,但是执行celery 命令的时候提示没有_ssl模块什么的 手动在Python解 ...
- celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)
一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...
- 使用celery之怎么让celery跑起来(转)
原文:http://www.dongwm.com/archives/how-to-use-celery/ 前言 自从发了上次的文章使用celery之深入celery配置, 有一些网友再问我怎么让cel ...
- celery 快速入门教程 celery 定时器
当然首先得安装celery和rabbitmq-server,如果有redis需要安装redis 安装Redis $ yum install redis 启动 Redis $redis-server 检 ...
- Celery学习笔记
转载请注明出处:点我 我的第一篇博客!嘿嘿! 在公司实习,接触到的第一个项目就用到了Celery,之前是完全没有接触过Celery这玩意,然后花了点时间仔细的研究了下怎么用.在学习过程中也遇到了些问题 ...
- 初识Celery
本系列文章的开发环境: window + python2. + pycharm5 + celery3.1.25 + django1.9.4 在我们日常的开发工作中,经常会遇到这几种情况: 1.在web ...
- Python 任务队列 Celery
一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...
- celery学习笔记2
1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部分 (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代 ...
- Django部署以及整合celery
前言 Djngo部署的结构一般都是nginx+uwsgi+python web 一.新建一个Djang项目并合并celery 项目名随便打的..命名规范驼峰啥的别和我扯犊子哈 跑一下,然后我们就有一个 ...
随机推荐
- 收藏的一些javascript片段
原文:收藏的一些javascript片段 学习js也很有一段时间,收集了一些js的片段.特地整理排版了一下,以一个js初学者的视界来分析注释了这些代码段,暂且不去讨论它的性能和优化问题,相信会对一些初 ...
- ROOT android 原理。 基于(zergRush)
出自: http://bbs.gfan.com/android-2996211-1-1.html 须要ROOT的同学请去上面的地址下载. a.控制手机创建个暂时目录,然后把zergRush脚本写入此目 ...
- CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...
- C#操作 Advantage Database Server 数据库
相关下载 http://devzone.advantagedatabase.com/dz/content.aspx?key=31 1.安装数据库: Advantage Database Server ...
- checkbox属性checked="checked"但状态不是勾选状态的解决办法
原因: jQuery API明确说明,1.6+的jQuery要用prop,不能用attr否则无效,尤其是checkBox的checked的属性的判断.
- linux下mysql的远程连接
在服务器上安装mysql后,想使用本地的mysql客户端连接数据库时,提示不允许连接,比较郁闷,找到了这篇文章解决了我的问题: 内容如下: 本地计算机ip:192.168.1.100远程计算机ip:1 ...
- select刷新后,保持选定状态,Cookies存储select选定状态信息
//cookies存储select选定值,防止刷新后没了 window.onload = function () { var cooki = document.cookie; if (cooki != ...
- 如何判断微信内置浏览器(通过User Agent实现)
在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信 ...
- PHP激活用户注册验证邮箱
本文将结合实例介绍如何使用PHP+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 注册邮箱激活流程 <ul class='ul_demo''> <li ...
- 学习Swift写iOS?那写安卓和WinPhone呢?请看一石三鸟终极解决方案 - Silver!
首先,你必须知道的是,Silver是苹果最新编程语言Swift的免费实现版本. 通过Silver,你可以使用Swift语言来编写.NET,Java,安卓和Cocoa APIs.你甚至可以在这些平台上共 ...