Celery 是个啥?
大白话说: celery 就是一个异步处理任务的模块,当然也可以作为一个定时任务
Celery 异步任务
首先需要整明白celery程序执行时候的路径逻辑
以 celery 启动命令为根路径去导报,pycharm里面可能会报错,但是在celery启动的时候是没有问题的
单文件模式
单位文件模式是指: app 的定义和任务都写在一个py文件例如
tasks.py
from main import Celery
# app = Celery('tasks', broker='amqp://guest@8.141.169.238//')
app = Celery('task',
backend='redis://127.0.0.1',
broker='amqp://guest@8.141.169.238//')
@app.task
def adds(x, y):
return x + y
这模式下就无需考虑启动路径和导报路径的问题 启动只需要 cd 到 tasks.py 所在的文件内输入
celery worker -A tasks -l info -P event
多文件模式
文件结构
msg 和sms 都是任务的文件夹
conf 是celery 的配置文件
main 是生成一个celery app
因为是一mycelermys为根路径所以在 msg 和sms 文件中的导入路径如下
msg/tasks.py
import time
from mycelerys.main import app
@app.task
def send_smg(name):
print(f"向{name}发送短信")
time.sleep(4)
return "发送短信完成"
sms/tasks.py
import time
from mycelerys.main import app
@app.task
def send_sms(name):
print("向{}发送短信")
time.sleep(4)
return "发送短信完成"
config.py
BROKER_URL = 'redis://127.0.0.1:6379/1' # 指定 Broker
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2' # 指定 Backend
CELERY_TIMEZONE='Asia/Shanghai' # 指定时区,默认是 UTC
# CELERY_TIMEZONE='UTC'
CELERY_IMPORTS = ( # 指定导入的任务模块
'mycelerys.sms.tasks',
'mycelerys.msg.tasks'
)
main.py
from celery import Celery
from mycelerys import conf
app = Celery('test',config_source=conf)
注意:最后在 mycelermys 的父目录下执行
celery worker -A mycelermys.main -l info -P eventlet
定时任务
方式1 执行代码
from celery_tasks import send_email
from datetime import datetime
# 方式一
v1 = datetime(2022, 7 ,18, 14, 19, 40)
print(v1)
v2 = datetime.utcfromtimestamp(v1.timestamp())
print(v2)
result = send_email.apply_async(args=["egon",], eta=v2)
print(result.id)
# 方式二
ctime = datetime.now()
# 默认用utc时间
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
from datetime import timedelta
time_delay = timedelta(seconds=10)
task_time = utc_ctime + time_delay
# # 使用apply_async并设定时间
result = send_email.apply_async(args=["egon"], eta=task_time)
print(result.id)
方式2 配置文件方式
from datetime import timedelta
from celery import Celery
from celery.schedules import crontab
cel = Celery('tasks', broker='redis://127.0.0.1:6379/1', backend='redis://127.0.0.1:6379/2', include=[
'celery_tasks.task01',
'celery_tasks.task02',
])
cel.conf.timezone = 'Asia/Shanghai'
cel.conf.enable_utc = False
cel.conf.beat_schedule = {
# 名字随意命名
'add-every-10-seconds': {
# 执行tasks1下的test_celery函数
'task': 'celery_tasks.task01.send_email',
# 每隔2秒执行一次
# 'schedule': 1.0,
# 'schedule': crontab(minute="*/1"),
'schedule': timedelta(seconds=6),
# 传递参数
'args': ('张三',)
},
# 'add-every-12-seconds': {
# 'task': 'celery_tasks.task01.send_email',
# 每年4月11号,8点42分执行
# 'schedule': crontab(minute=42, hour=8, day_of_month=11, month_of_year=4),
# 'args': ('张三',)
# },
}
以配置文件方式启动
celery beat -A proj
再启动
celery -A proj worker -l info