1.异步任务celery和中间人rabbitmq
1.1 celery提供异步任务,遇到耗时操作的任务都可以交给celery来完成
1.2 通信过程是,生产者(任务发布者)—>消息队列(broker)(rabbitmq或者是redis)<—消费者(任务执行人), 生产者把任务缓存在消息队列中,消费者从任务队列中把任务取出来执行。
1.3 rabbitmq的安装:https://blog.csdn.net/zhangerfeng333/article/details/106424918
2.celery的使用
# celery的安装;
pip install -U Celery
# 使用创建主文件main.py
# 1.设置django配置
import os
os.environ["DJANGO_SETTINGS_MODULE"] = '这里是写项目配置位置' # demo.settings.dev
from celery import Celery
# 创建celery 实例对象
celery_app = Celery('demo') # 这里的第一个参数是模块名称,='__main__',第二个参数是broker的url
# 如果想使用Redis作为结果后端,但仍使用RabbitMQ作为消息代理(一种流行的组合):
# app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')
# 对于大的项目可以使用,单独的配置文件这里的目录是celery_tasks
celery_app.config_from_object('celery_tasks.config')
# 注册任务,自动加载可用的任务
celery_app.autodiscover_tasks(
[
'celery_tasks.任务一',
'celery_tasks.任务二'
]
)
# 使用task装饰器轻松地从任何可调用对象创建任务
@celery_app.task(bind=true,name='send_sms_code',retry_backoff=3)
def send(self,sms_code,**kwargs)
#该bind参数表示该函数将是“绑定方法”,以便您可以访问任务类型实例上的属性和方法。
# bind:保证task对象会作为第一个参数自动传入
# 任务装饰器的bind参数将提供对self(任务类型实例)的访问
# name:异步任务别名
# retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s
# max_retries:异常自动重试次数的上限
# return ****
print(sms_code)
# 启动服务使用
celery -A celery_task.main worker -l info
# -A 指对应的应用程序, 其参数是项目中 Celery实例的位置。
# worker 指这里要启动的worker。
# -l 指日志等级,比如info等级。
# 任务默认是进程执行,如果想要使用高并发,可以使用协程方式执行任务
# 默认是进程池方式,进程数以当前机器的CPU核数为参考,每个CPU开四个进程。
# 如何自己指定进程数:celery worker -A proj --concurrency=4
# 如何改变进程池方式为协程方式:celery worker -A proj --concurrency=1000 -P eventlet -c 1000
pip insatll eventlet
celery -A celery_task.main worker -l info -P eventlet -c 1000
# 调用celery任务使用delay()方法检验参数后,把任务添加到celery
send_sms_code.delay(sms_code,**kwrags)