1.安装celery
pip install -U celery -i https://pypi.douban.com/simple ##-U是指update的意思
#一定要确保一件事,redis启动了, 因为是使用redis为容器,里面有生产者和消费者
2.创建mycelery目录
luffyapi/ ├── mycelery/ ├── config.py # 配置文件 ├── __init__.py ├── main.py # 主程序 └── sms/ # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖 └── tasks.py # 任务的文件,名称必须是这个!!!
3.main.py代码编写如下
# 主程序
from celery import Celery
# 创建celery实例对象
app = Celery("luffy")
# 如果想要在celery中执行django的代码,例如模型操作,日志记录,则必须在当前celery中对django进行初始化
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
import django
django.setup() #
# 通过app对象加载配置
app.config_from_object("mycelery.config")
# 自动搜索并加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["mycelery.sms"])
# 启动Celery的命令
# 强烈建议切换目录到项目的根目录下启动celery!!
# celery -A mycelery.main worker --loglevel=info
# 启动Celery的命令
# 切换目录到mycelery根目录下启动
# celery -A mycelery.main worker --loglevel=info
如果是在window环境下运行项目,启动celery, 那么请安装
pip3 install eventlet
然后启动命令为celery -A mycelery.main worker --loglevel=info -P eventlet
4.配置文件config.py代码编写如下
# 任务队列的链接地址 broker_url = 'redis://127.0.0.1:6379/15' # 结果队列的链接地址 result_backend = 'redis://127.0.0.1:6379/14'
5.创建一个任务文件sms/tasks.py,并创建任务,代码:
# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!! from mycelery.main import app @app.task # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名 def send_sms(): print("发送短信!!!") @app.task # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名 def send_sms2(): print("发送短信任务2!!!")
6.最终来调用异步任务
# 1. 声明一个和celery一模一样的任务函数,但是我们可以导包来解决 from mycelery.sms.tasks import send_sms # 2. 调用任务函数,发布任务 send_sms.delay(mobile,sms_code) # send_sms.delay() 如果调用的任务函数没有参数,则不需要填写任何内容
7.启动定时任务(在config.py文件里面添加)
# 定时任务的调度器 from celery.schedules import crontab from .main import app # 定时任务的调度列表,用于注册定时任务 app.conf.beat_schedule = { # Executes every Monday morning at 7:30 a.m. 'check_order_outtime': { # 本次调度的任务 'task': 'check_order', # 这里的任务名称必须先到main.py中注册 # 定时任务的调度周期 # 'schedule': crontab(minute=0, hour=0), # 每周凌晨00:00 'schedule': crontab(), # 每分钟 # 'args': (16, 16), # 注意:任务就是一个函数,所以如果有参数则需要传递 }, }
8.增加定时任务要执行的函数(写在sms/tasks.py文件里面)
from mycelery.main import app @app.task(name="check_order") def checkout_order_outtime(): print("hello")
9.启动问题
celery -A mycelery.main beat #启动定时任务 celery -A mycelery.main worker --loglevel=info #然后开新终端,启动异步任务
#命令的中的mycelery是个python文件夹,mycelery.main 其实就是路径,以后启动可根据自己的路径进行修改