使用celery之怎么让celery跑起来(转)

时间:2023-02-25 15:38:10

原文:http://www.dongwm.com/archives/how-to-use-celery/

前言

自从发了上次的文章使用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),
},
}

使用celery之怎么让celery跑起来(转)的更多相关文章

  1. Python3安装Celery模块后执行Celery命令报错

    1 Python3安装Celery模块后执行Celery命令报错 pip3 install celery # 安装正常,但是执行celery 命令的时候提示没有_ssl模块什么的 手动在Python解 ...

  2. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  3. 使用celery之怎么让celery跑起来

    celery 官网帮助文档  http://docs.celeryproject.org/en/latest/index.html 前言 自从发了上次的文章使用celery之深入celery配置, 有 ...

  4. celery 快速入门教程 celery 定时器

    当然首先得安装celery和rabbitmq-server,如果有redis需要安装redis 安装Redis $ yum install redis 启动 Redis $redis-server 检 ...

  5. Celery学习笔记

    转载请注明出处:点我 我的第一篇博客!嘿嘿! 在公司实习,接触到的第一个项目就用到了Celery,之前是完全没有接触过Celery这玩意,然后花了点时间仔细的研究了下怎么用.在学习过程中也遇到了些问题 ...

  6. 初识Celery

    本系列文章的开发环境: window + python2. + pycharm5 + celery3.1.25 + django1.9.4 在我们日常的开发工作中,经常会遇到这几种情况: 1.在web ...

  7. Python 任务队列 Celery

    一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...

  8. celery学习笔记2

    1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部分 (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代 ...

  9. Django部署以及整合celery

    前言 Djngo部署的结构一般都是nginx+uwsgi+python web 一.新建一个Djang项目并合并celery 项目名随便打的..命名规范驼峰啥的别和我扯犊子哈 跑一下,然后我们就有一个 ...

随机推荐

  1. 【PRINCE2是什么】PRINCE2认证之七大原则

    经过前几讲中关于PRINCE2六大要素,四大步骤及整体思维架构的学习,相信各位看官已经对于PRINCE2有了大概的了解,那我们今天的学习内容会正式进入到七大原则内容的分享. 我们先来回顾一下,PRIN ...

  2. (转)实战Memcached缓存系统(4)Memcached的CAS协议

    1. 什么是CAS协议 很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS ...

  3. Thinkpad E430+CentOS 6.4+ linux-3.10.12内核网卡驱动(无线+有线)配置

    配置并编译安装内核模块和内核后,解压附件 firmware.tar.bz2,拷贝其中的rtlwifi文件夹到/lib/firmware下,然后 执行装载内核模块命令: sudo modprobe rt ...

  4. python快速搭建WebServer

    #!/usr/bin/python import SimpleHTTPServer import SocketServer import os PORT = 7777 WEBDIR = "/ ...

  5. TOMCAT程序的层级目录

    web | |---------js,jsp,html,css(资源文件在web根目录下面 可以被浏览器直接访问) |---------WEB-INF(配置文件web.xml   lib---jar ...

  6. 实验楼-高级Bash脚本编程指南

    实验1.Bash介绍与入门 1.简介:Bash是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝 ...

  7. libev ev_io_init学习

    #define ev_io_init(ev,cb,fd,events) / do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } w ...

  8. 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令

    1. 启动 Nginx poechant@ubuntu:sudo ./sbin/nginx 2. 停止 Nginx poechant@ubuntu:sudo ./sbin/nginx -s stop ...

  9. Java中的线程的优先级

    Java 中线程优先级简介: 1. Java 提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程. 按照线程的优先级决定应该调度哪个线程来执行. 2. 线程的优先级用数字表示, 范围从 1 到 ...

  10. Genymotion 在win10 下的安装

    首先我在Genymotion官网上并没有找到他的安装程序.据说是在注冊后,通过邮件里的链接下载,结果也没有看到.最后详细在哪下的,忘了收藏.我下的是 genymotion-2.5.3-vbox.exe ...