zoukankan      html  css  js  c++  java
  • 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的结果

  • 相关阅读:
    C struct 中字节对齐问题(转)
    蚁群算法,PSO算法以及两种算法可以融合的几种方法
    遗传及蚁群算法
    ListBox FAQ常用问题
    关于C#中ListBox控件重绘Item项
    创业艰难,问题多多
    asp.net客户端脚本验证小技巧
    防止ASP.NET按钮多次提交的办法
    鼠标点到文本框时的提示信息
    枚举的转换
  • 原文地址:https://www.cnblogs.com/sellsa/p/9757569.html
Copyright © 2011-2022 走看看