django+celery+docker搭建记录(1)-Celery使用

官方文档: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

这里使用RabbitMQ作为broker Redis作为backend

1.安装

1.1 安装celery

pip install celery


1.2 安装RabbitMQ

RabbitMQ用Erlang语言开发

下载epel仓库

yum install epel-release

安装erlang

yum install erlang

安装rabbitmq-server

yum install rabbitmq-server

启用管理界面插件

rabbitmq-plugins enable rabbitmq_management
启动
service rabbitmq-server start

管理界面端口为15672

添加用户相关命令

rabbitmqctl add_user <username> <userpass>
rabbitmqctl add_vhost <path>
rabbitmqctl set_user_tags <username> administrator
rabbitmqctl set_permissions -p <path> <username> ".*" ".*" ".*"

这里我们创建一个项目使用的用户(vanya)及Virtual Host (vanya)

rabbitmqctl add_user vanya 12345
rabbitmqctl add_vhost vanya
rabbitmqctl set_user_tags vanya administrator
rabbitmqctl set_permissions -p vanya vanya ".*" ".*" ".*"

登录后


1.3 安装Redis

安装

yum install redis

两种启动方式

service redis start
redis-server /etc/redis.conf

这里采用第二种方式,复制一个配置文件,并修改配置文件里的密码和端口

cp /etc/redis.conf /etc/redis6380.conf
vi /etc/redis6380.conf

端口改为6380(默认6379),添加密码(默认无密码,建议设置密码,空密码有漏洞)



后台启动

redis-server /etc/redis6380.conf &

其他命令

redis-cli -p 6380  # 连接redis
redis-cli -p 6380 shutdown  # 关闭服务

2. 使用Celery

2.1 worker文件

新建simple_task.py

from celery import Celery
app = Celery('simple_task', broker='amqp://vanya:12345@localhost:5672/vanya',
             backend='redis://:vanya@localhost:6380/0')

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

创建一个Celery对象,消息中间件使用RabbitMQ,用户密码虚拟机是上面创建好的,接收任务结果backend使用的是redis。

通过使用装饰起@app.task定义一个任务add,执行简单的相加。

2.2 调用

新建caller.py

from simple_task import add
add.delay(4, 5)

2.3 启动worker

使用celery命令启动worker

celery -A simple_task worker -l info
运行报错

ImproperlyConfigured: You need to install the redis library in order to use the Redis result store backend.

忘记python的redis库,安装一下即可:

pip install redis

再次运行成功

使用-c参数可指定worker的并发数,不指定默认为4个

2.4 调用

运行caller.py

python caller.py

调用后,worker窗口可看到输出如下:


这里调用端并未获取任务的结果

2.5 修改调用,获取结果

修改simple_task.py,添加time.sleep,模拟延长任务处理时间

@app.task
def add(x, y):
    for i in range(10):
        time.sleep(1)
    print 'add', x, y
    return x + y

修改caller.py

import time
from simple_task import add

result = add.delay(4, 5)
while not result.ready():
    print 'not ready'
    time.sleep(1)
print result.get()

重新启动worker,并调用caller,运行结果如下,可见多次获取状态为未准备好,最终任务结果返回为9:


2.6 加入进度

修改task,使调用者可获取进度信息

修改simple_task.py,装饰器加入bind=True,则add函数传入第一个变量为Task自身,使用Task的update_state函数更新任务状态。state为自己命名的状态名称(系统内建的状态有PENDING,STARTED,SUCCESS,FAILURE,RETRY,REVOKED),meta为传入信息,可通过Task.info获取

@app.task(bind=True)
def add(self, x, y):
    for i in range(10):
        self.update_state(state='PROGRESS', meta={'current': i, 'total': 10})
        time.sleep(1)
    print 'add', x, y
    return x + y
caller.py
result = add.delay(4, 5)
while not result.ready():
    print 'not ready, state={0}'.format(result.state)
    if result.state == 'PROGRESS':
        print 'current={0}, total={1}'.format(result.info['current'], result.info['total'])
    time.sleep(1)
print 'ready', result.state
print result.get()

调用者判断任务状态,如果状态为程序设置的PROGRESS,则可以通过info获取到设置的meta信息,caller.py运行结果:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django 项目中配置定时任务可以使用 CeleryCelery Beat。下面是使用 Celery Beat 的步骤: 1. 安装 celerydjango-celery-beat ``` pip install celery django-celery-beat ``` 2. 在项目 settings.py 中添加以下配置: ``` # celery 配置 CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # celery beat 配置 CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` 3. 在项目根目录下创建 celery.py 文件,并添加以下内容: ``` from __future__ import absolute_import, unicode_literals import os from celery import Celery # 设置默认 Django 设置模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') # 使用 Django 的 settings 文件配置 celery app.config_from_object('django.conf:settings', namespace='CELERY') # 自动发现每个应用中的 tasks.py 任务模块 app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request)) ``` 4. 在你的 Django 应用中创建 tasks.py 文件,并添加你的定时任务: ``` from celery import shared_task @shared_task def my_task(): # 执行你的任务 ``` 5. 运行 Celery Beat: ``` celery -A your_project beat -l info ``` 现在就可以在 Django 应用中使用 Celery Beat 来配置定时任务了,例如: ``` from django_celery_beat.models import PeriodicTask, IntervalSchedule from datetime import timedelta # 创建一个定时任务,每分钟执行一次 my_task schedule, created = IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.MINUTES) task = PeriodicTask.objects.create(interval=schedule, name='my_task', task='your_app.tasks.my_task', args='', start_time=datetime.now(), enabled=True) ``` 注意:Celery Beat 需要和 Celery Worker 一起运行,Celery Worker 负责执行任务,Celery Beat 负责调度任务执行时间。启动 Celery Worker 命令如下: ``` celery -A your_project worker -l info ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值