Celery 简单使用

环境:
  Centos7,
  python3

一:安装

pip3 install celery
pip3 install -U redis # py的redis库
sudo yum install redis # 安装redis数据库
redis-server #启动redis

 

二:简单应用

mkdir celery_test #创建文件夹
cd celery_test # 进入该文件夹
vim tasks.py # 创建tasks.py
from celery import Celery
app = Celery('tasks',backend='redis',  broker='redis://127.0.0.1')   # 这个tasks是模块的名字(tasks.py)
@app.task
def add(x, y):
    print(x+y)
    return x + y

启动Celery Worke 监听并执行任务:

celery -A tasks worker --loglevel=info

此时你可能会出现以下类似问题

ERROR/MainProcess] consumer: Cannot connect to redis://127.0.0.1:6379//: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error..
Trying again in 2.00 seconds..

这种情况是你的 RabbitMQ没装 或者 redis 没安装和启动。我的问题是安装好redis没启动,启动好后即可解决:

终端输入命令:redis-server                # 出现以下内容,表示启动成功

解决好后以上可能出现的问题后:出现以下内容表示celery启动成功

然后新打开一个运行python3的终端:

#调用任务
>>> from tasks import add >>> add.delay(4, 5) # 在运行的Worker终端会收到任务
# 查看任务是否运行结束
>>>result.ready()

# 查看任务结果
result.get()
# 9

三:项目应用

proj/proj/__init__.py:

 

proj/proj/celer.py

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('proj',
             broker='redis://127.0.0.1',  #将任务放到redis里
             backend='redis://127.0.0.1', # 将结果放到redis里
             include=['proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()

proj/proj/celer.py

from .celery import app


@app.task
def add(x, y):
return x + y


@app.task
def mul(x, y):
return x * y


@app.task
def xsum(numbers):
return sum(numbers)

# 启动worker:

celery -A proj worker -l info

#后台启动

celery multi start w1 -A proj -l info     # w1 是将日志都输出到log文件里,格式为 w1.log,当然也可以自定义

#重启

celery multi restart w1 -A proj -l info   

#停止

celery multi stop w1 -A proj -l info   # stop 是异步的,不会等待任务完成才退出。如果想要确保任务完成后才退出,则用以下命令:

celery multi stopwait w1 -A proj -l info

调用:

>>> from proj import tasks
>>> result = tasks.add.delay(2,2)
>>> result.get()
4

猜你喜欢

转载自www.cnblogs.com/leixiansheng6f6/p/9420367.html