celery
Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。
文档:http://docs.jinkan.org/docs/celery/getting-started/index.html
-
-
高效,单个celery进程每分钟可以处理数百万个任务。
-
灵活,celery中几乎每个部分都可以自定义扩展。
任务队列是一种跨线程、跨机器工作的一种机制.
任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理.
celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。
一个celery系统可以包含很多的worker和broker
Celery本身不提供消息队列功能,但是可以很方便地和第三方提供的消息中间件进行集成,包括RabbitMQ,Redis,MongoDB等
pip install -U celery
tar xvfz celery-0.0.0.tar.gz cd celery-0.0.0 python setup.py build python setup.py install
一般celery任务目录直接放在项目的根目录下即可,路径:
luffyapi/ ├── my_celery/ ├── config.py # 配置文件 ├── __init__.py ├── main.py # 主程序 └── sms/ # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖 └── tasks.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
# 任务队列的链接地址 broker_url = 'redis://127.0.0.1:6379/15' # 结果队列的链接地址 result_backend = 'redis://127.0.0.1:6379/14'
# 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导入
# 调用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
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 的方式去调用
# 用 . 的方式,类似于在项目中调包的过程