如何在Django中使用Celery

本篇文章给大家分享的是有关如何在Django中使用Celery,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

安装

pipinstalldjango-celery

这个命令使用的依赖是 Celery 3.x 的版本,所以会把我之前安装的 4.x 卸载,不过对功能上并没有什么影响。我们也完全可以仅用Celery在django中使用,但使用 django-celery 模块能更好的管理 celery。

使用

可以把有关 Celery 的配置放到 settings.py 里去,但我比较习惯单独一个文件来放,然后在 settings.py 引入进来:

#celery_config.py
importdjcelery
importos

os.environ.setdefault('FORKED_BY_MULTIPROCESSING','1')
djcelery.setup_loader()

BROKER_URL='redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2'

#UTC
CELERY_ENABLE_UTC=True
CELERY_TIMEZONE='Asia/Shanghai'

CELERY_IMPORTS=(
'app.tasks',
)

#有些情况可以防止死锁
CELERY_FORCE_EXECV=True

#设置并发的worker数量
CELERYD_CONCURRENCY=4

#任务发送完成是否需要确认,这一项对性能有一点影响
CELERY_ACKS_LATE=True

#每个worker执行了多少任务就会销毁,防止内存泄露,默认是无限的
CELERYD_MAX_TASKS_PER_CHILD=40

#规定完成任务的时间
CELERYD_TASK_TIME_LIMIT=15*60#在15分钟内完成任务,否则执行该任务的worker将被杀死,任务移交给父进程

#设置默认的队列名称,如果一个消息不符合其他的队列就会放在默认队列里面,如果什么都不设置的话,数据都会发送到默认的队列中
CELERY_DEFAULT_QUEUE="default"

#设置详细的队列
CELERY_QUEUES={
"default":{#这是上面指定的默认队列
"exchange":"default",
"exchange_type":"direct",
"routing_key":"default"
},
"beat_queue":{
"exchange":"beat_queue",
"exchange_type":"direct",
"routing_key":"beat_queue"
}

}

配置文件中设置了 CELERY_IMPORTS 导入的任务,所以在django app中创建相应的任务文件:

#app/tasks.py
fromcelery.taskimportTask
importtime

classTestTask(Task):
name='test-task'#给任务设置个自定义名称

defrun(self,*args,**kwargs):
print('starttesttask')
time.sleep(4)
print('args={},kwargs={}'.format(args,kwargs))
print('endtesttask')

在 settings.py 添加:

INSTALLED_APPS=[
#...
'djcelery',
]

#Celery
fromlearn_django.celery_configimport*

触发任务或提交任务可以在view中来调用:

#views.py
fromdjango.httpimportHttpResponse
fromapp.tasksimportTestTask

deftest_task(request):
#执行异步任务
print('startdorequest')
t=TestTask()
t.delay()
print('enddorequest')
returnHttpResponse('ok')

启动 woker 的命令是:

pythonmanage.pyceleryworker-linfo

再启动django,访问该view,可以看到任务在worker中被消费了。

定时任务

在celery的配置文件 celery_config.py 文件中添加:

CELERYBEAT_SCHEDULE={
'task1-every-1-min':{#自定义名称
'task':'test-task',#与任务中name名称一致
'schedule':datetime.timedelta(seconds=5),
'args':(2,15),
'options':{
'queue':'beat_queue',#指定要使用的队列
}
},

}

通过 options 的 queque 来指定要使用的队列,这里需要单独的队列是因为,如果所有任务都使用同一队列,对于定时任务来说,任务提交后会位于队列尾部,任务的执行时间会靠后,所以对于定时任务来说,使用单独的队列。

启动 beat:

pythonmanage.pycelerybeat-linfo

监控工具 flower

如果celery中的任务执行失败了,有些场景是需要对这些任务进行监控, flower 是基于 Tornado 开发的web应用。安装用 pip install flower ;启动它可以是:

pythonmanage.pyceleryflower

#pythonmanage.pyceleryflower--basic_auth=admin:admin

用浏览器访问 http://localhost:5555 即可查看:

如何在Django中使用Celery

以上就是如何在Django中使用Celery,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

发布于 2021-03-26 01:50:25
收藏
分享
海报
0 条评论
159
上一篇:怎么在Mac中安装Anaconda 下一篇:怎么在Android 中使用 dlib+opencv 实现一个动态人脸检测功能
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码