什么是Celery
Celery是管理分布式队列工具,可用于进行任务队列的使用和管理
Celery的结构
-
Brokers
brokers为中间人,也就是任务队列,主要是用来存放和拿去任务的地方 -
backend
backend主要是用来存放队列中的任务执行完后的结果或者状态 -
Wokers
wokers是去执行任务队列里面的任务 -
Tasks
tasks是我们要放入任务队列的任务
[图片上传失败...(image-e0868f-1552622464942)]
Celery的安装
apt-get install redis-server
pip install redis
pip install celery
测试Demo
#tasks.py
from celery import Celery
app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0') #配置好celery的backend和broker
@app.task #普通函数装饰为 celery task
def add(x, y):
return x + y
终端运行celery -A tasks worker --loglevel=inf
#trigger.py
from tasks import add
result = add.delay(4, 4) #不要直接 add(4, 4),这里需要用 celery 提供的接口 delay 进行调用
while not result.ready():
time.sleep(1)
print 'task done: {0}'.format(result.get())
运行该文件
错误问题处理
image.png错误原因:python3.6后引进async关键词与celery下的一个模块名相同
解决方案:将所有有引用该模块的地方包括celery的async模块的名字都改为另外一个名字如async_2
错误原因:任务没被加入到队列中
解决方案:在@app.task()添加属性name='Demo.tasks.add'-》@app.task(name='Demo.tasks.add')
错误原因:网上说的错误原因是可能是windows10下运行celery所以报的错,但我的是windos7错误原因占时不明
解决方案:
- 可行:终端运行命令改为celery -A tasks worker --pool=solo -l info(亲测可行)
- windows10下:pip install eventlet,后终端运行命令改为celery -A <mymodule> worker -l info -P eventlet
(eventlet下载失败,可行性未知)
网友评论