异步任务_Django+Celery实现定时任务和异步任务

简介:

Celery is a simple, flexible, and reliable distributed system to process vast amounts of messages, while providing operations with the tools required to maintain such a system.
It’s a task queue with focus on real-time processing, while also supporting task scheduling.

Celery是一个简单、灵活和可靠的分布式系统,可以处理大量的消息,同时提供维护这样一个系统所需的工具。它是一个任务队列,关注实时处理,同时支持任务调度。

内容:

Django是一个很好用的python的web开发框架,日常开发任务中,难免会遇到一些需要用到异步或者定时执行的任务,或者是要执行一些耗时操作。Celery是一个很强大的异步任务工具。

配置:

1、首先需要安装响应的包,这里我们直接使用djcelery

pip install django-celery
pip install celery # 建议目前先不要使用4.1或者4.2版本的celery
pip install django-redis

2、在settings项目配置文件注册app ,加入“djcelery“

fb39e7f30c341912b8bdcb1642f3272f.png

3、编辑celery配置文件,一般会在某个需要使用celery的app下面创建celery.py文件,为了每个app可能对celery配置有不同需求;也可以统一配置,使用一个celery.py文件,这里大家根据实际需求配置。这里直接使用redis作为消息中间件,任务数据直接存储到本地数据库

# ~*~ coding: utf-8 ~*~
from __future__ import absolute_import, unicode_literals
import os
from datetime import timedelta
from celery import Celery
from celery.schedules import crontab
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jumpserver.settings')
from django.conf import settings
app = Celery('app')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: [app_config.split('.')[0]
for app_config in settings.INSTALLED_APPS])
CELERY_CREATE_MISSING_QUEUES = True # 某个程序中出现的队列,在broker中不存在,则立刻创建它
CELERYD_CONCURRENCY = 30 # 并发worker数
CELERYD_FORCE_EXECV = True # 非常重要,有些情况下可以防止死锁
CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker最多执行万100个任务就会被销毁,可防止内存泄露
BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/6' % {
'password': CONFIG.REDIS_PASSWORD if CONFIG.REDIS_PASSWORD else '',
'host': CONFIG.REDIS_HOST or '127.0.0.1',
'port': CONFIG.REDIS_PORT or 6379,
}
# BROKER_URL = 'redis://:密码@主机地址:端口号/数据库号'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
# CELERY_RESULT_BACKEND = BROKER_URL
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERYD_MAX_TASKS_PER_CHILD = 40
CELERY_TIMEZONE = 'Asia/Shanghai'
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 120}
CELERY_DISABLE_RATE_LIMITS = True
# 配置定时任务
app.conf.update(
CELERYBEAT_SCHEDULE={
'refresh-asset-hardware-info': {
'task': 'app.tasks.update_assets_hardware_period', # 任务名
'schedule': 60*60*60*24, # 执行时间(可以去官网看,执行规则的配置方式)
'args': (), # 执行任务方法所需参数
}
}
)

4、编辑任务,任务方法必须定义在每个app下面的tasks.py文件,当启动celery时,会自动去加载每个app下面tasks.py文件所定义的任务,这里以一个异步发送邮箱的任务为例子。

from __future__ import absolute_import
# from celery import shared_task
from django.core.mail import send_mail
from django.conf import settings
from app import celery_app as app
@app.task
def send_mail_async(*args, **kwargs): """ Using celery to send email async You can use it as django send_mail function Example: send_mail_sync.delay(subject, message, from_mail, recipient_list, fail_silently=False, html_message=None) Also you can ignore the from_mail, unlike django send_mail, from_email is not a require args: Example: send_mail_sync.delay(subject, message, recipient_list, fail_silently=False, html_message=None) """
if len(args) == 3:
args = list(args)
args[0] = settings.EMAIL_SUBJECT_PREFIX + args[0]
args.insert(2, settings.EMAIL_HOST_USER)
args = tuple(args)
send_mail(*args, **kwargs)

4 启动celery

celery -A common worker -B -l debug #app为celery.py文件所在的app名

到这里,一个最简单的celery异步任务已经完成了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值