1、运行celery worker
# -A 指的是运行的celery实例,形式为:module.path:attribute
# 如果仅指定了包名称,它将尝试按以下顺序搜索应用程序实例
# 与--app=proj:
# 1、名为 的属性proj.app
# 2、名为 的属性proj.celery
# 3、模块proj中值为 Celery 应用程序的任何属性
# 如果这些都没有找到,它会尝试一个名为 的子模块proj.celery:
# 4、名为 的属性proj.celery.app
# 5、名为 的属性proj.celery.celery
# 6、模块proj.celery中值为 Celery 应用程序的任何属性。
celery -A proj worker --loglevel=info
celery -A celery_tasks.main worker --loglevel=info -P eventlet -c 10 # windows下需要使用eventlet方式启动 -c是协程的数量,生产环境可以用1000
celery -A celery_tasks.main flower 启动监控
celery -A proj beat 周期性任务需执行
# 服务器启动celery
celery multi start -A celery_tasks.main worker -l info --logfile=celery.log --pidfile=celery.pid
默认情况下,它将在当前目录中创建 pid 和日志文件。为了防止多个工作人员在彼此之上启动,我们鼓励您将它们放在一个专用目录中:
$ mkdir -p /var/run/celery
$ mkdir -p /var/log/celery
$ celery multi start w1 -A proj -l INFO --pidfile=/var/run/celery/%n.pid --logfile=/var/log/celery/%n%I.log
# 修改celery之后, 重启本celery
celery multi restart -A celery_tasks.main worker -l info --logfile=celery.log --pidfile=celery.pid # --pidfile参数可以确保没有旧worker运行,可能意外启动很多个worker,劫持任务
# 停止celery
celery multi stop w1 -A proj -l INFO # 不会等待任务完成
celery multi stopwait w1 -A proj -l INFO # 会确保退出之前完成所有当前正在执行的任务
# Stopping the worker 停止worker可以使用ctrl + C
2、配置文件加载
app.config_from_object('celeryconfig') # celeryconfig.py必须可以从当前目录或 Python 路径加载名为的模块
broker_url = 'amqp://myuser:mypassword@localhost:5672/myvhost' # rabbitmq配置
app.conf.broker_url = 'redis://:password@hostname:port/db_number' # redis配置,如:app.conf.broker_url = 'redis://localhost:6379/0' 默认为localhost 端口 6379,使用数据库 0
result_backend = 'redis://127.0.0.1:6379/2' # 用Redis做结果存储,celery默认情况下禁用结果,flow等是通过事件通知的,每个任务唯一标识符(UUID),返回变量调用get函数可以获取到结果,类似:
>>> res = add.delay(2, 2)
>>> res.get(timeout=1)
4
# 直接连接到 Redis Sentinel 列表:
app.conf.broker_url = 'sentinel://localhost:26379;sentinel://localhost:26380;sentinel://localhost:26381'
app.conf.broker_transport_options = { 'master_name': "cluster1" }
app.conf.broker_transport_options = {'visibility_timeout': 3600} # Redis 的默认可见性超时为 1 小时 3600
3、监控状态
status: List active nodes in this cluster
$ celery -A proj status 显示在集群中线上的worker名单
4、Redis相关
pip install -U "celery[redis]" 一次性安装celery和redis依赖项
5、问题:
1、[结果后端不工作或任务始终处于PENDING状态](https://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#id1)
6、源码相关
celery 自己实现的一个 有向无环图(DAG)的数据结构,根据命令行传入的不同参数,初始化不同的组件,并执行这些组件的初始化方法。
7、任务调用
add.delay(2, 2)
subs.apply_async(args=[55,22],
task_id='aaaaa2222',
countdown=5,
shadow = 'zouzou'
)
""" apply_async后可跟以下参数
task_id:任务唯一id
countdown:任务多长时间后执行,单位为秒
eta:定义任务的开始时间,eta=time.time()+5,单位为秒,是UTC时间,设置成国内时间也没有用
expires:设置任务过期时间,任务在过期时间后还没有执行则被丢弃,单位为秒
retry:如果任务失败后,是否重试,默认为True
shadow:重新指定任务的名字,覆盖其在日志中使用的任务名称
retry_policy:{} 重试策略,max_retries:最大重试次数,默认为3次。interval_start:重试等待的时间间隔,默认为0。interval_step:每次重试让重试间隔增加的秒数,默认为0.2秒。interval_max:重试间隔最大的秒数,既通过interval_step增大到多少秒之后,就不在增加了,默认为0.2秒。
routing_key:自定义路由键
queue:指定发送到哪个队列
exchange:指定发送到哪个交换机
priority:任务队列的优先级,0到255之间,对于rabbitmq来说0是最高优先级
headers:为任务添加额外的消息
"""
app.send_task(task1.add,args=[1,2])
# 不建议用,因为不会校验是否存在这个方法,直接就发送成功里,celery执行就会报错