文档章节

python-celery使用教程

go-skyblue
 go-skyblue
发布于 2015/07/23 15:14
字数 687
阅读 878
收藏 3

Celery

Celery是Python开发的分布式任务调度模块。分为任务分发,任务队列,worker3个部分。celery的出现,解决了python运行后台任务的需求。

这篇文章介绍的celery版本是3.1.18

celery架构

                                                                +------------------+
                                                       +------> | celery worker.1  |
+-----------------+       +-----------------------+    |        +------------------+
|   web service   +-----> | job queue(redis or ..)+----+                            
+-----------------+       +-----------------------+    |        +------------------+
                                                       +------> | celery worker.2  |
                                                       |        +------------------+
                                                       |                            
                                                       |        +------------------+
                                                       +------> | celery worker.[n]|
                                                                +------------------+

任务队列,支持如redis,RabbitMQ甚至数据库。通常redis是最好的选择,不过数据库在本地使用的时候,也是不错的。

安装celery

使用douban的pypi镜像,安装会快一点。

pip install -i http://pypi.douban.com/simple celery

普通使用

使用Redis作为Broker时,再安装一个celery-with-redis

开始编写tasks.py:

import time
from celery import Celery

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

@celery.task
def sendmail(mail):
    print('sending mail to %s...' % mail['to'])
    time.sleep(2.0)
    print('mail sent.')

if __name__ == '__main__':
    sendmail.delay(dict(to='myemail@gogs.io'))

启动worker

celery -A tasks worker

运行任务

python tasks.py

这里普通的调用方式是sendmail(...) 如果改成后台运行就变成了sendmail.delay(...)

Celery默认设置就能满足基本要求。Worker以Pool模式启动,默认大小为CPU核心数量,缺省序列化机制是pickle,但可以指定为json。由于Python调用UNIX/Linux程序实在太容易,所以,用Celery作为异步任务框架非常合适。

flask中使用celery

web中使用celery是常有的事情。heroku官方就推荐python程序使用celery。 代码,我放到github上一份https://github.com/codeskyblue/celery-examples

首先创建一个web.py文件

from flask import Flask
from celery import Celery


def make_celery(app):
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task
    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery

app = Flask(__name__)
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)

编写任务函数

@celery.task()
def add_together(a, b):
    res = a + b
    print res
    return res

然后是一个主页, 请求主页的时候,就会自动调用add_together这个函数,交给celery运行

@app.route('/')
def homepage():
    a = random.randint(0, 10)
    b = random.randint(0, 10)
    add_together.delay(a, b)
    return 'Create new task {} + {}'.format(a, b)

然后还需要编写一个run.py文件(这里需要分开两个文件)

from web import app

if __name__ == '__main__':
    app.run()

启动web应用python web.py,启动worker的方法celery -A web.celery worker

如果需要用sqlite作为后端的话,也是可以的,首先需要安装pip install sqlalchemy

flask的app配置稍微改下

app.config.update(
    CELERY_BROKER_URL='sqla+sqlite:///queue.db',
    CELERY_RESULT_BACKEND='db+sqlite:///queue.db',
    CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
)

然后,celery就会用本地的queue.db文件,作为队列了。

Refs

© 著作权归作者所有

共有 人打赏支持
go-skyblue

go-skyblue

粉丝 75
博文 50
码字总数 31881
作品 5
杭州
程序员
私信 提问
基于Celery的并行处理工程-OpenWorker快速安装

Celery 是一个简单灵活的Python并行处理框架,但是相关的几个工程需要独自安装和配置,给小白的使用带来困难。 OpenWorker是基于Python的并行处理框架,将集成Celery、Flower、Jobtastic和R...

openthings
2015/08/10
0
4
基于Celery的并行处理工程-OpenWorker

OpenWorker-初始建立(2015-05-29),欢迎参与:https://github.com/supergis/OpenWorker。 OpenWorker-基于Python的并行处理框架,将集成Celery、Flower、Jobtastic和Rodeo工程,可以通过...

openthings
2015/05/29
0
1
python任务调度模块celery

python任务调度模块celery celery简介 Celery是一个python开发的异步分布式任务调度模块。 Celery本身并不提供消息服务,使用第三方服务,也就是borker来传递任务,一般使用rabbitMQ或者Red...

laoba
05/28
0
0
Django初步使用Celery

Django初步使用Celery 1、Celery方式的选择 这里Celery的中间人,我采用Redis。也可以用Django自身和mongodb等。Celery的中间人你可以理解为在Celery执行过程中的数据支持。保存列队记录、执...

_Change_
09/25
0
0
Python celery简介

Celery异步分布式 什么是celery? 他是一个python开发的异步分布式任务调度模块 celery本身不提供消息服务,使用第三方服务,也就是broker来传递任务,目前支持rabbitmq,redis,数据库等等。...

lemonwater
08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

降压变换器 Buck

特点 输入输出极性相同。 工作过程 在 MOS 导通时,输入电源通过 L 和 C 滤波后向负载端提供电流;当 MOS 断开后,L 通过二极管续流,保持负载电流连续。输出电压因为占空比的作用,不会超过...

colinux
今天
1
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
3
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部