celery 使用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值