celery异步处理(django)

celery官⽅⽂档:
http://docs.jinkan.org/docs/celery/getting-started/first-steps-with-celery.html#first-steps

Celery的安装

pip install celery==4.4.0
pip install celery-with-redis==3.0
#django-celery-results库基于 Django ORM实现了结果存储后端
pip install django-celery-results==1.2.0
pip install django-celery==3.3.1

配置
在 settings.py⽂件中设置

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = (
 ...
 'celery',
 'django_celery_results', #把 django_celery_results 加到
INSTALLED_APPS 中
 '⾃⼰的APP',
 'djcelery'
 }
 
BROKER_URL='redis://localhost:6379/5'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json' # 任务序列化和反序列化使⽤
json
CELERY_RESULT_SERIALIZER = 'json' # 结果序列化为json


# 邮件配置
# smtp服务的邮箱服务器
EMAIL_HOST = 'smtp.126.com'
# smtp服务固定的端⼝是25
EMAIL_PORT = 25 # 也有可能是465
#发送邮件的邮箱
EMAIL_HOST_USER = 'landmark_csl@126.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'csl111'
#收件⼈看到的发件⼈ <此处要和发送邮件的邮箱相同>
EMAIL_FROM = 'python<landmark_csl@163.com>'


import djcelery
djcelery.setup_loader()

创建celery实例
在settings.py的同级⽬录下新建celery.py

from __future__ import absolute_import #绝对路径导⼊
from celery import Celery
from django.conf import settings
import os
#设置系统的环境配置⽤的是Django的
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "⼯程名字.settings")
#实例化celery
app = Celery('mycelery')
app.conf.timezone = "Asia/Shanghai"
#指定celery的配置来源 ⽤的是项⽬的配置⽂件settings.py
app.config_from_object("django.conf:settings")
#让celery ⾃动去发现我们的任务(task)
app.autodiscover_tasks() #你需要在app⽬录下 新建⼀个叫tasks.py(⼀定不要
写错)⽂件

在settings.py同级⽬录下的init.py加⼊

from __future__ import absolute_import
from .celery import app as celery_app

1.创建任务
在需要使⽤异步任务的APP⽬录下新建tasks.py


from celery.signals import task_success
from celery import shared_task
import time

# 自定义任务
from django.core.mail import send_mail

from day10.settings import EMAIL_HOST_USER


@shared_task
def intro(name,age):
    print("我是{},{}岁了".format(name,age))
    time.sleep(2)

# 异步发送邮件
@shared_task
def send(subject,content,receiver):
    """
    :param subject: 邮件主题
    :param content: 邮件内容
    :param receiver: 接收者,只能是字符串
    :return:
    """
    send_mail(subject,content,EMAIL_HOST_USER,recipient_list=[receiver])

2.调用
在views.py内的调⽤

任务函数名.delay(参数,,,,)

3.生成数据库表

python manage.py migrate django_celery_results

4.启动worker

celery -A 你的⼯程名 worker -l info

注意:修改tasks.py的内容后 要重启celery的服务

5.获取任务执⾏结果
异步任务执⾏完毕后,会⾃动触发信号:
before_task_publish
after_task_publish
task_prerun
task_postrun
task_success
task_failure
task_revoked

from celery.signals import task_success
@task_success.connect(sender=add)
def task_done_handler(sender=None, result=None):
 print(result)

计划任务(定点执行)

在settings中设置

CELERYBEAT_SCHEDULE = {
    "every-ten-second-run-my_task": {
        "task": "App.tasks.fib",函数位置
        "schedule": crontab(minute="01", hour="15"),执行时间
        "args": (10,)执行次数
    }
}

在tasks.py中

@shared_task
def fib(n):
    num = 0
    n1 = n2 = 1
    for i in range(3,n+1):
        num = n1 + n2
        n1, n2 = n2, num
    return num

我们启动定时任务服务时 也要先开启worker
启动: celery -A 你的⼯程名称 beat -l info

定时任务

settings中设置

 celery定时任务配置
# CELERYBEAT_SCHEDULE = {
#     'schedule-test': {
#         'task': 'App.tasks.hello',文件
#         'schedule': timedelta(seconds=3),时间间隔
#
#     },
#
# }

tasks中

@shared_task
def hello():
    print("武汉加油")

其他所有调用同上最开始

其他

1、查看异步任务情况

Celery提供了⼀个⼯具flower,将各个任务的执⾏情况、各个worker的健康状态进⾏监控并以可视化的⽅式展现,

安装flower:

pip install flower

启动flower(默认会启动⼀个webserver,端⼝为5555):

celery flower --broker=redis://localhost:6379/5

即可查看

http://localhost:5555

内存泄漏

1。说明
⻓时间运⾏Celery有可能发⽣内存泄露,可以像下⾯这样设置
2.示例代码

CELERYD_MAX_TASKS_PER_CHILD = 1000 # 每个worker执⾏了多少任务就会死掉

常⽤配置清单
3. 说明
4. 配置信息

#from kombu import Queue, Exchange
# 设置Broker和backend
BROKER_URL = 'redis://127.0.0.1:6379/0' 
# 将数据存放到redis1数据库,redis默认有16个数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_TASK_SERIALIZER = 'json' # 任务序列化和反序列化
使⽤json
CELERY_RESULT_SERIALIZER = 'json' # 结果序列化为json
CELERY_ACCEPT_CONTENT = ['json'] # 分布式接受数据的类型
为json
CELERY_TIMEZONE = 'Asia/Shanghai' #使⽤中国上海时区
CELERY_ENABLE_UTC = True 
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 后端存储任务超过⼀天,
则⾃动清理数据,单位为秒
CELERYD_MAX_TASKS_PER_CHILD = 1000 # 每个worker最多执⾏
1000个任务就会被销毁,可防⽌内存泄露
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值