CnPlayer

?找回密码
?立即注册
搜索
热搜: 活动 交友 discuz
查看: 59|回复: 0
打印 上一主题 下一主题

[转帖] celery在Django中的使用

[复制链接]

97

主题

127

帖子

2584

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2584
跳转到指定楼层
楼主
发表于 2019-9-20 01:26:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转自:https://bluemrd.github.io/2018/1 ... %E4%BD%BF%E7%94%A8/

celery在Django中的使用
发表于 2018-10-18 |??更新于 2018-10-19 |??分类于 Python |??阅读次数: 142 本文字数: 2.5k

celery在Django中的使用安装依赖
1
2
3
pip install django
pip install celery
pip install redis
本文使用的消息队列是 redis , 所以需要下载 redis
启动redis
cmd 进入redis` 的根目录下,输入
1
redis-server.exe redis.windows.conf
如图所示,即启动成功
celery配置
创建一个django 项目与一个 app 应用,然后在其中新建一些 py 文件用来配置 celery ,基本形式如下
在 settings.py 文件目录下新建了一个 celery.py 文件
在 app 目录下新建了一个 tasks.py 文件
注意:这两个文件不可随意命名,必须为 celery 与 tasks
celery.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*-coding:utf-8-*-cd


from __future__ import absolute_import, unicode_literals
import os
from celery import Celery


# celerydemo 为django项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celerydemo.settings')

# 这里使用的是redis作消息队列,所以需进行设置
# 若 redis 未设置密码,写为broker="redis://localhost"
# 若 redis 已设置密码,则写为broker="redis://:password@localhost" (password为设置的密码)
365棋牌怎么不一样 app = Celery('celerydemo', backend='redis', broker="redis://:123456@localhost")

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()
tasks.py
该文件下写异步任务,例如
1
2
3
4
5
6
7
8
from celery import shared_task
import time


@shared_task
def long_time_operation():
? ? time.sleep(10)
? ? return 'Async Op!'
celerydemo/__init__.py
1
2
3
4
5
6
from __future__ import absolute_import

from .celery import app as celery_app


__all__ = ['celery_app']
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.http import HttpResponse
from .tasks import long_time_operation


# 异步
def async_op(request):
? ? long_time_operation.delay()
? ? return HttpResponse("Async Op!")

# 同步
def block_op(request):
? ? long_time_operation()
? ? return HttpResponse("Finished!")
celerydemo/urls.py
1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
? ? path('admin/', admin.site.urls),
? ? path('celery/', include('demo.urls')),
]
demo/urls.py
1
2
3
4
5
6
7
8
9
from django.urls import path
from . import views


app_name= 'demo'
urlpatterns = [
? ? path('async/', views.async_op),
? ? path('block/', views.block_op),
]
启动celery并运行项目
在命令行中输入
1
celery -A celerydemo worker -l info
若如图所示,则表示 celery 启动成功
然后另打开一个命令行,运行项目
1
python manage.py runserver
测试
在浏览器中输入 127.0.0.1:8000/celery/block_op,会加载 10s 才返回 Finished!
在浏览器中输入127.0.0.1:8000:celery/async_op,会立即返回 Async Op!
报错与解决方法
windows下对celery官方示例进行测试时会报错
tasks.py
1
2
3
4
5
6
7
from __future__ import absolute_import, unicode_literals
from celery import shared_task
import time

@shared_task
def add(x, y):
? ? return x+y
报错为
1
ValueError: not enough values to unpack (expected 3, got 0)
报错原因未知
解决方法一:
下载 eventlet
1
pip install evnetlet
然后在启动celery时,输入命令为
1
celery -A worker celerydemo -l info -P eventlet
再次进行测试即可
解决方法二:
无须下载任何库,只需在启动celery时,输入命令为
1
celery -A worker celerydemo --pool=solo -l info
即可

-------------本文结束感谢阅读-------------





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|玩儿家 ( 京ICP备16001541号-1 )

GMT+8, 2019-9-28 12:11 , Processed in 0.053808 second(s), 20 queries .

Powered by Discuz! X3.4

? 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表