栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 异步定时任务

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 异步定时任务

异步任务的搭建
 flask与Django配置有差异,这里使用Django,

创建异步文件夹celery_task,和以下目录文件

__init__文件配置

from celery import Celery
from datetime import timedelta

import os
import django

# 调用项目环境
os.environ.setdefault("DJANGO_SETTINGS_MODULE","s1.settings")
django.setup()

# 异步任务

celery_app = Celery("mycelery")  # 创建一个异步任务
celery_app.config_from_object('celery_task.config')  # 读取config里的配置

# 定时任务

celery_app.autodiscover_tasks(['celery_task.times'])# 文件夹名.文件名

celery_app.conf.update(
    CELERYBEAT_SCHEDULE={
        'sum-task': {
            # 文件夹名.文件名.方法名
            'task': 'celery_task.times.my_con',
            # 多少秒执行一次(eg:5秒一执行)
            'schedule': timedelta(seconds=5),
            # 这是传入my_con方法中的参数
            'args': (5, 6)
        },

        'sum-task1': {
            'task': 'celery_task.times.my_print',
            'schedule': timedelta(seconds=3),
            'args': ()
        },
    }
)


config.py文件配置

# (注释部分仅为查询到的资料,未测试使用,仅供参考)


# 如果使用 redis 作为中间人——任务队列(消息队列)———作用:暂存任务的地方
# 需要这样配置:
# broker_url = 'redis://192.168.203.153:6379/3'
# 如果需要密码的话
# BROKER_URL='redis://:xxxxx@127.0.0.1:6379/2'

# 如果使用别的作为中间人, 例如使用 rabbitmq
# 则 rabbitmq 配置如下:
# broker_url= 'amqp://用户名:密码@ip地址:5672'

# 例如:
# meihao: 在rabbitq中创建的用户名, 注意: 远端链接时不能使用guest账户.
# 123456: 在rabbitq中用户名对应的密码
# ip部分: 指的是当前rabbitq所在的电脑ip
# 5672: 是规定的端口号
# broker_url = 'amqp://meihao:123456@172.16.238.128:5672'


broker_url = 'redis://127.0.0.1:6379/0'
# 结果队列的链接地址
result_backend = 'redis://127.0.0.1:6379/1'

# 时区
# CELERY_TIMEZONE = 'Asia/Shanghai'
timezone = 'Asia/Shanghai'

# 导入指定的任务模块
imports = (
    'celery_task.task'
)

task.py文件配置

# 自定义异步方法

import time
import random
import redis

from celery_task import celery_app
from ronglian_sms_sdk import SmsSDK
from rest_framework.response import Response
from django.core import mail

# 定义发送短信方法
accId="8aaf07087de13e4***********"
accToken="419de3ed6144***********"
appId ="8aaf07087de13************"

# @app.task 指定将这个函数的执行交给celery异步执行
@celery_app.task()
def send_mess(phone):
    '''生成短信验证码'''
    sdk = SmsSDK(accId, accToken, appId)
    tid = '1'  # 短信验证码模板
    # 验证码随机生成
    datas = (random.randint(000000, 999999),)
    print("生成的短信验证码>>>", datas)
    # 短信验证码的模板  手机号  验证码随机生成
    resp = sdk.sendMessage(tid, phone, datas)
    # print("验证码的内容>>>",resp)
    # 存入redis库中
    rdb = redis.Redis(host='localhost', port=6379, db=0)
    # setex (key,秒,验证码)
    if rdb.get('sms_%s' % phone):
        return Response({'msg': "短信已发送,不能重复发送", 'code': 500})
    rdb.setex("sms_%s" % phone, 300, datas[0])
    rdb.close()
    return resp


# 定义发送邮箱方法 
@celery_app.task(name='send_email1')
def send_email1(subject, message, from_email, to_email):
    time.sleep(10)
    mail.send_mail(subject, message, from_email, to_email)
    print('发邮件')

times.py文件配置

# 自定义定时任务,调用在__init__里配置,

#简单定义测试方法

from celery_task import celery_app
@celery_app.task()
def my_con(x,y):
    print(x,y)
    print('x和y相加')
    return x+y

@celery_app.task()
def my_print():    
    print('22222222')


调用命令

# 启动异步任务

# celery -A 任务名 worker -l info -P eventlet
# celery -A celery_task worker -l info -P eventlet


# 启动定时任务

# celery -A 任务名 beat -l info
# celery -A celery_task beat -l info

 注意事项

# 注意:任务需要在终端启动后才可以使用
# 注意:要先启动异步任务才能启动定时任务

# 注意:在导入方法,并调用时,需要在方法名后加.delay,加上才是异步调用执行
# 例:调用发送手机短信验证码

# 调用发送手机短信验证码
from celery_task.task import send_message


phone = 13462336969
send_message.delay(phone)

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号