Celery分布式队列和使用

Celery的基本使用与介绍

参考官方文档:>>>>>>>>>>>>>http://docs.celeryproject.org/en/latest/

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

  • 假如我想拿到这个任务的ID,我需要得到这个ID在去执行下一步,我可以在任务执行中,就可以做下一步事情。
  • 可以一个定时任务进行消息的推送

Celery有以下优点:

  • 简单:熟系简单的 celery的流程和配置后,就可以进行使用
  • 高可用:如果连接丢失或失败,工作人员和客户端将自动重试,并且一些代理以主/主主/副本复制的方式支持HA 
  • 快速:单个Celery进程每分钟可处理数百万个任务,具有亚毫秒的往返延迟(使用RabbitMQ,librabbitmq和优化设置)。
  • 灵活:Celery的几乎每个部分都可以自行扩展或使用,自定义池实现,序列化器,压缩方案,日志记录,调度程序,消费者,生产者,代理传输等等。

Celery安装使用:

Celery的默认broker是RabbitMQ, 仅需配置一行就可以

broker_url = 'amqp://guest:guest@localhost:5672//'

使用Redis也行

pip3 install -U "celery[redis]"

参数配置

Configuration is easy, just configure the location of your Redis database:

app.conf.broker_url = 'redis://localhost:6379/0'
Where the URL is in the format of:

redis://:password@hostname:port/db_number
all fields after the scheme are optional, and will default to localhost on port 6379, using database 0.

 

如果想获取每个任务的执行结果,还需要配置一下把任务结果存在哪

If you also want to store the state and return values of tasks in Redis, you should configure these settings:

app.conf.result_backend = 'redis://localhost:6379/0'
View Code

项目中使用Celery

格式:

proj/__init__.py
    /celery.py
    /tasks.py

proj/celery.py内容

from __future__ import absolute_import, unicode_literals
from celery import Celery
 
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])
 
# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)
 
if __name__ == '__main__':
    app.start()

proj/tasks.py中的内容

from __future__ import absolute_import, unicode_literals
from .celery import app


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


@app.task
def mul(x, y):
    return x * y


@app.task
def xsum(numbers):
    return sum(numbers)

 Celery定时任务

配置脚本periodic_task.py

from celery import Celery
from celery.schedules import crontab
 
app = Celery()
 
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
 
    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)
 
    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )
 
@app.task
def test(arg):
    print(arg)

celery_setting.py(也可以添加到 例如Django配置文件中)

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
app.conf.timezone = 'UTC'

 

posted @ 2019-01-18 17:06  Jacob先生  阅读(391)  评论(1编辑  收藏  举报