首页 > 运维 > linux运维 > 正文

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

看不見的法師
发布: 2025-07-16 09:44:18
原创
673人浏览过

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

关于Celery的底层原理,这里就不再赘述了,简单的流程图可以一图概括:

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

安装相应的库:

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中文网其它相关文章!

热门游戏推荐
热门游戏推荐

最近有什么好玩的游戏?最近哪些游戏比较好玩?这里为大家带来热门游戏合集,汇聚了最新最好玩的高分爆款游戏,还在为不知道玩什么游戏而烦恼的玩家,快来保存下载体验吧!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号