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
  1. 安装:pip install -U celery[redis]
  2. 配置: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中可视化编辑。
安装使用步骤:

  1. 使用pip安装:
    pip install django-celety-beat
  2. 将django_celery_beat模块加入到settings.py文件中 INSTALLED_APPS中:
INSTALLED_APPS = (
 ...,
 'django_celery_beat',
)
  1. 在数据库中迁移必要的表:
    python manage.py migrate
  2. 开启celery beat服务:
    celery -A proj beat -l info --scheduler django_celery_beat.scheduler:DatabaseScheduler 5.在django-admin 可视化管理 定期任务