zoukankan      html  css  js  c++  java
  • Django:使用celery处理异步任务

    1、创建Django项目和APP

    略过

    2、在my_app目录下新建tasks.py模块

    3、安装 celery

    pip install celery==3.1.18

     celery4不再支持windows,所以在Windows环境下使用请选择celery==3.1.18

    4、broker选择

      Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人。 作为中间人,我们有几种方案可选择:

    • RabbitMQ

    RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。使用RabbitMQ的细节参照以下链接: http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq

    如果我们使用的是Ubuntu或者Debian发行版的Linux,可以直接通过下面的命令安装RabbitMQ: sudo apt-get install rabbitmq-server 安装完毕之后,RabbitMQ-server服务器就已经在后台运行。如果您用的并不是Ubuntu或Debian, 可以在以下网址: http://www.rabbitmq.com/download.html 去查找自己所需要的版本软件。

    • Redis

    Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。 关于使用哪个Redis作为Broker,可访下面网址: http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis

    本次使用Redis作为broker

    pip install redis==2.10.6

    redis使用2.10.6版本,之前用最新的3.5.3会出错

    5. 创建应用

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等,在使用celery的时候,app必须能够被其他的模块导入。

    在上面创建的tasks.py模块中写入如下:

    import random
    from time import sleep
    from celery import Celery
    
    
    # 我们这里案例使用redis作为broker,和数据存储
    broker = 'redis://127.0.0.1:6379/2'
    backend = 'redis://127.0.0.1:6379/3'
    app = Celery('demo', broker=broker, backend=backend)
    
    
    # 创建任务函数,使用@app.task注解将my_task函数变为异步
    @app.task
    def my_task(a, b):
        print("开始执行任务了,代号:{},结果为:{}".format(random.randint(1, 100), a+b))
        sleep(15)
        print("异步任务执行完成")
        return a+b

    Celery第一个参数demo是给其设定一个名字, 第二参数我们设定一个中间人broker, 在这里我们使用Redis作为中间人。my_task函数是我们编写的一个任务函数, 通过加上装饰器app.task, 将其注册到broker的队列中。

    6、启动celery worker

    在项目根目录下运行:

    celery -A my_app.tasks worker --loglevel=info

    启动好了之后最下方显示如下,太长没有截全

     

     后续测试发现任务已经执行,但是状态一直是PENDING,且Redis中也没有写入return的结果。----这种现象好像是windows才会有Linux正常

    解决办法:参数后加上 --pool=solo

    celery -A my_app.tasks worker --loglevel=info --pool=solo

    相关问题:

    https://www.v2ex.com/t/177589

    https://stackoverflow.com/questions/25495613/celery-getting-started-not-able-to-retrieve-results-always-pending?rq=1

     7、将任务函数加入到队列中

    任务加入到broker队列中,以便刚才我们创建的celery worker服务器能够从队列中取出任务并执行。

    如何将任务函数加入到队列中,可使用delay()。

    可以看到已经可以获取任务的结果了。

    8、查看控制台任务是否执行,Redis是否写入返回值

     

     

      可以看到celery worker服务器从队列中取出任务并执行,且Redis中也已存储task的返回值

     9、安装flower可视化监控celery任务及broker

    pip install flower

     启动flower,指定broker

    celery flower --broker=redis://localhost:6379/2

    启动好了如下:

     访问:

     查看task:

    参考:https://blog.csdn.net/mbl114/article/details/78046694

  • 相关阅读:
    HashMap按键排序和按值排序
    LeetCode 91. Decode Ways
    LeetCode 459. Repeated Substring Pattern
    JVM
    LeetCode 385. Mini Parse
    LeetCode 319. Bulb Switcher
    LeetCode 343. Integer Break
    LeetCode 397. Integer Replacement
    LeetCode 3. Longest Substring Without Repeating Characters
    linux-网络数据包抓取-tcpdump
  • 原文地址:https://www.cnblogs.com/gcgc/p/14134806.html
Copyright © 2011-2022 走看看