• celery


    Celery介绍

    Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。

    文档:http://docs.jinkan.org/docs/celery/getting-started/index.html

    Celery的特点是:

    • 简单,易于使用和维护,有丰富的文档。

    • 高效,单个celery进程每分钟可以处理数百万个任务。

    • 灵活,celery中几乎每个部分都可以自定义扩展。

    任务队列是一种跨线程、跨机器工作的一种机制.
    任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理.
    celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。

    Celery的架构

    Celery的架构由三部分组成,消息队列(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

    一个celery系统可以包含很多的worker和broker

    Celery本身不提供消息队列功能,但是可以很方便地和第三方提供的消息中间件进行集成,包括RabbitMQ,Redis,MongoDB等

    安装

    pip install -U celery

    也可从官方直接下载安装包:https://pypi.python.org/pypi/celery/

    tar xvfz celery-0.0.0.tar.gz
    cd celery-0.0.0
    python setup.py build
    python setup.py install

    使用

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

    一般celery任务目录直接放在项目的根目录下即可,路径:

    luffyapi/
    ├── my_celery/
        ├── config.py     # 配置文件
        ├── __init__.py   
        ├── main.py       # 主程序
        └── sms/          # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖
            └── tasks.py  # 任务的文件,名称必须是这个!!!

    main.py,代码:

    # 主程序
    from celery import Celery
    # 创建celery实例对象 第一位参数为名字
    app = Celery("luffy")
    
    # 通过app对象加载配置
    app.config_from_object("my_celery.config")
    
    # 自动搜索并加载任务
    # 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
    # app.autodiscover_tasks(["任务1","任务2",....])
    app.autodiscover_tasks(["my_celery.sms","my_celery.cache"])
    
    # 启动Celery的命令
    # 强烈建议切换目录到项目的根目录下启动celery!!
    # celery -A my_celerymain worker --loglevel=info

    配置文件config.py,代码:

    # 任务队列的链接地址
    broker_url = 'redis://127.0.0.1:6379/15'
    # 结果队列的链接地址
    result_backend = 'redis://127.0.0.1:6379/14'

    创建一个任务文件sms/tasks.py,并创建任务,代码:

    # celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
    from my_celery.main import app
    
    @app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
    def send_sms(x):
        print(f"{x}发送短信!!!")
    
    @app.task(name="send_sms2")  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
    def send_sms2():
        print("发送短信任务2!!!")
    
    # 调用 .delay()
    # send_sms.delay(1)

    运行代码

    celery -A my_celery.main worker --loglevel=info

    django导入

    在程序中调用上面的异步任务,拿django进行举例:

    # 调用celery执行异步任务
    from my_celery.sms.tasks import send_sms
    send_sms.delay(mobile)

    其他参考文档:

    http://docs.celeryproject.org/en/latest/getting-started/introduction.html

    https://github.com/celery/celery/tree/master/examples/django/

    https://www.jianshu.com/p/1840035cb510

    https://flower.readthedocs.io/en/latest/screenshots.html

    celery定时操作

    my_celery/main.py 主程序,实例化celery

    # 主程序
    from celery import Celery
    
    print(11111111111)
    # 创建celery实例对象
    app = Celery("celery1")
    
    
    # 通过app对象加载配置 旧版本设置的变量前端先不要加上 namespace
    app.config_from_object('my_celery.config', namespace='CELERY')
    
    # 自动搜索并加载任务
    # 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
    # app.autodiscover_tasks(["任务1","任务2",....])
    app.autodiscover_tasks(["my_celery.sms","my_celery.dishi"])

    my_celery/config.py配置文件

    # 定时任务
    from celery.schedules import crontab
    from my_celery.main import app
    # CELERY STUFF
    #CELERY_BROKER_URL = 'redis://:{}@{}:6379/6'.format(REDIS_PASSWD, REDIS_HOST)
    #CELERY_RESULT_BACKEND = 'django-db'  # 任务结果保存到项目数据库
    
    # 任务队列的链接地址
    CELERY_BROKER_URL = 'redis://127.0.0.1:6379/15'
    # 结果队列的链接地址
    CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/14'
    
    
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    #CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
    #CELERY_TIMEZONE = "UTC"
    CELERY_TIMEZONE = 'Asia/Shanghai'
    CELERY_ENABLE_UTC = True  # 禁用utc时间
    CELERY_IMPORTS = ["my_celery.dishi.tasks"]
    CELERY_REDIS_MAX_CONNECTIONS = 200
    DJANGO_CELERY_BEAT_TZ_AWARE = False
    
    app.conf.beat_schedule = {
        # Executes every Monday morning at 7:30 a.m.
        'add-every-monday-morning': {
            'task': 'shijian',
            'schedule': crontab(),
        },
    }
    
    # 定时配置
    # https://docs.celeryproject.org/en/v4.4.7/userguide/periodic-tasks.html

    my_celery/dishi/tasks.py   消息队列文件

    from celery import shared_task
    
    from my_celery.main import app
    import datetime
    
    @app.task(name='shijian')   # 加上别名
    def shijian():
        a=datetime.datetime.now()
        return a

    定时任务启动命令

    # 启动worker 
    # celery -A my_celery.main worker --loglevel=info
    
    
    # 启动broker
    # 定时需要一直启动,如果单纯异步则不需要
    # celery -A my_celery.main beat


    # 不要进行 my_celery/和 .py 的方式去调用
    # 用 . 的方式,类似于在项目中调包的过程
  • 相关阅读:
    毕业设计(五)
    毕业设计:周计划任务(四)
    毕业设计:周计划任务(三)
    毕业设计:周计划任务(二)
    毕业设计:周计划任务(一)
    运行jar包
    常见算法
    mybatis入门
    策略模式
    java面2
  • 原文地址:https://www.cnblogs.com/Pythonzrq/p/11837625.html
Copyright © 2020-2023  润新知