首先要明确的是,celery 4.1+版本的官方文档已经详细说明了,在该版本之后,无需再引入依赖于django-celery库,直接使用celery本身即可。在去年年初的一篇文章中提到的python 3.7.2和django 2.0.4使用django-celery时遇到的一些问题,现今已不存在。技术更新速度越来越快,本文将详细介绍如何使用新版celery(4.4.2)来实现异步任务。
关于Celery的底层原理,这里就不再赘述了,简单的流程图可以一图概括:

安装相应的库:
pip3 install celery==4.4.2 pip3 install eventlet==0.25.2 pip3 install Django==2.0.4
eventlet是一个高性能的协程库,用于解决Windows 10下Celery进程的bug。
配置settings.py文件:
CELERY_BROKER_URL = 'redis://localhost:6379/' CELERY_RESULT_BACKEND = 'redis://localhost:6379/' CELERY_RESULT_SERIALIZER = 'json'
这里的broker配置使用了Redis,同时任务结果也存储在Redis中,格式为JSON,便于读写。
在settings.py同级目录下创建celery.py文件:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
<h1>设置环境变量</h1><p>os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')</p><h1>注册Celery的APP</h1><p>app = Celery('mydjango')</p><h1>绑定配置文件</h1><p>app.config_from_object('django.conf:settings', namespace='CELERY')</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/1199">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175680111347139.jpg" alt="Eva Design System">
</a>
<div class="aritcle_card_info">
<a href="/ai/1199">Eva Design System</a>
<p>基于深度学习的色彩生成器</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="Eva Design System">
<span>86</span>
</div>
</div>
<a href="/ai/1199" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="Eva Design System">
</a>
</div>
<h1>自动发现各个app下的tasks.py文件</h1><p>app.autodiscover_tasks()注意,mydjango是你当前Django项目的名称。
修改settings.py同级目录下的init.py文件:
from <strong>future</strong> import absolute_import, unicode_literals from .celery import app as celery_app</p><h1>导包</h1><p>import pymysql</p><h1>初始化</h1><p>pymysql.install_as_MySQLdb()</p><p><strong>all</strong> = ['celery_app']
在应用中创建tasks.py文件:
from celery.task import task</p><h1>自定义要执行的task任务</h1><p>@task
def print_test():
print("nice try")
return 'hello'如果需要,也可以在settings.py中将该任务配置为定时任务(周期任务):
from celery.schedules import crontab</p><p>CELERY_BEAT_SCHEDULE = {</p><h1>周期性任务</h1><pre class="brush:php;toolbar:false;"><code>'task-one': {
'task': 'myapp.tasks.print_test',
'schedule': 5.0, # 每5秒执行一次
# 'args': ()
}}
同时,异步任务也可以通过Django的视图在线调用:
from myapp import tasks</p><p>def ctest(request, *args, **kwargs):
res = tasks.print_test.delay()</p><h1>任务逻辑</h1><pre class="brush:php;toolbar:false;"><code>return JsonResponse({'status': 'successful', 'task_id': res.task_id})</code></pre><p>这里的delay方法是异步请求方式,而非Django默认的同步执行步骤。</p><p>在manage.py的目录下启动Celery服务:</p><pre><code class="javascript">celery worker -A mydjango -l info -P eventlet</code></pre><p>在浏览器中调用异步服务接口:</p><p><img src="/uploads/20250419/17450288936803071d29c1e.jpg" alt="Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)" /></p><p>同时,也可以在backend中查询任务结果:</p><p><img src="/uploads/20250419/17450288936803071d9922c.jpg" alt="Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)" /></p><p>注意一点,Redis中的key并不是单纯的task_id,而是需要加上前缀celery-task-meta-。</p><p>最后,如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务:</p><pre><code class="javascript">celery -A mydjango beat -l info</code></pre><p>可以看到任务队列会每隔五秒执行一次定时任务:</p><p><img src="/uploads/20250419/17450288936803071dde476.jpg" alt="Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)" /></p><p>总体而言,Celery 4.4.2解决了许多bug,例如著名的async关键字问题,同时优化了性能。在eventlet协程库的支持下,性能更加强大,入门门槛也比以前低了不少。</p>以上就是Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号