Flask实战第66天:celery实现异步任务

Celery文档:http://docs.celeryproject.org

Celery 通过消息进行通信,用专用的工作线程不断监视任务队列以执行新工作。

Celery需要消息传输来发送和接收消息。RabbitMQ和Redis代理传输功能齐全,但也支持无数其他实验解决方案,这里我们选择redis.

下面我们开始写个demo来演示怎么使用它。

  安装redis, 地址: 10.2.2.120:6379

  安装celery

pip install celery

  在windows操作系统上还要安装eventlet 

pip install eventlet

  安装redis插件

pip install redis

新建个纯python环境:

tasks.py用来配置任务的, main.py 用来执行

编辑tasks.py

# task:任务
# broker(中间人):存储任务的队列
# worker:真正执行任务的工作者
# backend:用来存储任务执行后的结果

from celery import Celery
import time

celery = Celery("tasks",
                broker="redis://10.2.2.120:6379/0",
                backend="redis://10.2.2.120:6379/0")

@celery.task   #加上此装饰器,这个函数就变成celery任务了(task)
def send_mail():
    print('邮件开始发送....')
    time.sleep(10)
    print('邮件发送结束!')

编辑main.py

from tasks import send_mail

if __name__ == '__main__':
    send_mail.delay()     #这样调用,就会变成异步任务了,不会被阻塞

然后我们在 项目目录启动 worker来监听任务

在Linux系统中是不需要制定 --pool的

(bbs) D:\celery_demo>celery -A tasks.celery --pool=eventlet worker --loglevel=info

 

执行main.py来触发任务,结果会发现,main.py会立马执行结束,并不会被阻塞在那里等待10s

下面是我连续执行两次main.py的结果

 

posted @ 2018-10-08 22:07  sellsa  阅读(2646)  评论(0编辑  收藏  举报