Celery 是一个简单的、灵活且可靠的,处理大量消息的分布式系统,并且维护这样一个系统的必要工具。
- 我们需要什么?
发送者(sender),接收者(broker) ,工作者(worker)
最简单的应用
from celery import Celery
app = Celery('hello', broker="amqp://guest@localhost//")
@app.task
def hello():
return 'hello world'
- broker:中间人,任务队列,负责接收任务
可以使用rabbitmq,和redis 当然,还有其他的数据库
- 使用redis
- 安装:
pip install -U celery[redis]
- 配置:
BROKER_URL='redis://localhost:6379/0'
url格式为:redis://:password@hostname:port/db_number
3.如果你想在redis存储任务的状态和返回值,应该配置这些项:CELERY_RESULT_BACKEND='redis://localhost:6379/0'
- 运行Celery制程服务器:
celery -A tasks worker --loglevel=info
保存结果
如果你想保持追踪任务的状态,
Celery可以做到,Celery需要 在某个地方存储这些状态。可以使用SQLAlchemy/Django ORM,Memcached,Redis,AMQP(RabbitMQ)或MongoDB,或者你可以自制
- 只需要在Celery实例里配置backend参数即可:app = Celery('tasks', backend="redis://localhost:6379/0", broker="redis://localhost"6379/1")
- 如果选择使用配置模块,则通过CELERY_RESULT_BACKEND选项来设置
配置好结果后,再次调用任务,会返回AsyncResult实例:result = hello.delay()
**read()**方法查看任务是否完成处理:
result.read()
True
你也可以等待任务完成,但这很少使用,因为它把异步变成了同步调用:
result.get(timeout=1)
hello world
配置
- 通过CELERY_TASK_SERIALIZER来配置序列化任务载荷的默认序列化方式:
app.conf.CELERY_TASK_SERIALZER= ‘json’
- 如果你一次性设置多个选项,可以使用update:
app.conf.update(
CELERY_TASK_SERIALZER='json',
CELERY_ACCEPT_CONTENT=['json'],
CELERY_RESULT_SERIALIZER='json',
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENBLE_UTC = True,
)
对于大型项目,采用独立配置更为有效,事实上你会为硬编码周期任务间隔和任务路由选项感到沮丧,因为中心化保存配置最合适。
你可以调用config_from_object()来让Celery实例加载配置模块:app.config_from_object('celeryconfig')
配置模块通常称为celeryconfig,你也可以叫其他名。
celeryconfig.py:
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND="amqp://"
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER='json'
CELERY_ACCEPT_CONTENT=['json']
CELERY_TIMEZONE='Europe/Oslo'
CELERY_ENALE_UTC = True
调用任务
使用**delay()**方法调用任务task1.delay()
**delay()方法是apply_async()**方法的简写task1.apply_async()
可以增加参数,像执行的时间点(countdown),应该被传入的队列,等等:task1.delay((2,2), queue='lopri', countdown=10)
上面的例子中,task1任务函数被传入(2,2)参数,传入名为‘lopri’的队列,在消息发送10秒后执行任务
如果需要任务的返回值,你可以获取它:
res = task1.delay()
res.get(timeout=1)
你可以获取该任务的id:res.id
你也可以获取到异常和执行轨迹,如果任务抛出异常的话,实际上**reslult.get()**将可能默认的获取一些错误
>>> res = task1.delay()
>>> res.get(timeout=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/devel/celery/celery/result.py", line 113, in get
interval=interval)
File "/opt/devel/celery/celery/backends/amqp.py", line 138, in wait_for
raise self.exception_to_python(meta['result'])
TypeError: add() takes exactly 2 arguments (1 given)
定时任务(celery beat)
celery beat 是一个调度安排表,可以设定某个任务在某个时刻被执行
使用自定义调度类
在使用django开发时,可以使用django-celery-beat拓展在数据库表存储调度信息,可以在django admin中可视化编辑。
安装使用步骤:
- 使用pip安装:
pip install django-celety-beat
- 将django_celery_beat模块加入到settings.py文件中 INSTALLED_APPS中:
INSTALLED_APPS = (
...,
'django_celery_beat',
)
- 在数据库中迁移必要的表:
python manage.py migrate
- 开启celery beat服务:
celery -A proj beat -l info --scheduler django_celery_beat.scheduler:DatabaseScheduler
5.在django-admin 可视化管理 定期任务