Diretório
Tarefas assíncronas do aipo
Quando o arquivo é executado, o diretório em que o arquivo está localizado será adicionado à variável de ambiente
Ao executar a importação relativa com ".", O arquivo em que a instrução de importação está localizada não pode ser um arquivo de execução
Adicionar tarefas via script
'''
# ...\luffyapi\scripts\celery\celery_task\celery.py
from celery import Celery
app = Celery(broker='redis://localhost:6379/0', backend='redis://localhost:6379/1', include=['celery_task.tasks'])
# ...\luffyapi\scripts\celery\celery_task\tasks.py
from .celery import app
@app.task
def task1(x, y):
print('task1')
return 'task1_res: %s' % str(x + y)
@app.task
def task2(a, b):
print('task2')
return 'task2_res: %s' % str(a - b)
# 在cmd终端cd到: ...\luffyapi\scripts\celery, 然后执行: celery worker -A celery_task -l info -P gevent 启动worker服务
# ...\luffyapi\scripts\celery\add_task.py
from celery_task.tasks import task1, task2
from datetime import datetime, timedelta
task1.apply_async(args=(10, 20))
task2.apply_async(args=(10, 20), eta=datetime.utcnow() + timedelta(seconds=10))
# ...\luffyapi\scripts\celery\get_results.py
from celery_task.celery import app
from celery.result import AsyncResult
async = AsyncResult(id="6dd3fdaf-ef6f-4fd9-9de9-48b39562fc57", app=app)
if async.successful():
result = async.get()
print(result)
'''
Inicie um novo serviço de batida para adicionar tarefas
'''
# ...\luffyapi\celery_task\celery.py
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev_settings")
from celery import Celery
app = Celery(broker='redis://127.0.0.1:6379/0', backend='redis://127.0.0.1:6379/1', include=['celery_task.tasks'])
app.conf.timezone = 'Asia/Shanghai' # 设置时区
# from celery.schedules import crontab
from datetime import timedelta
app.conf.beat_schedule = { # Scheduler: Sending due task xxx (celery_task.tasks.update_banner_cache)
'xxx': {
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'task': 'celery_task.tasks.update_banner_cache',
'schedule': timedelta(seconds=10),
'args': (),
},
}
# ...\luffyapi\celery_task\tasks.py
from .celery import app
from luffyapi.apps.home.models import Banner
from luffyapi.apps.home.serializers import BannerModelSerializer
from django.conf import settings
from django.core.cache import cache
# 使用celery添加任务周期性更新django缓存
@app.task
def update_banner_cache():
banner_queryset = Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()[:settings.BANNER_AMOUNT]
banner_ser = BannerModelSerializer(banner_queryset, many=True)
for banner in banner_ser.data:
banner['image'] = "%s%s" % (settings.BASE_URL, banner.get('image')) # BannerModelSerializer类根据request对象拼接后端url根路径
cache.set('banner_cache', banner_ser.data)
return True
# 打开一个cmd, cd到: E:\luffy\luffyapi, 然后执行: celery worker -A celery_task -l info -P gevent 启动worker服务
# 打开另一个cmd, cd到: E:\luffy\luffyapi, 然后执行: celery beat -A celery_task -l info 启动beat服务
'''
Tabela de banco de dados
Classe livre, classe prática, classe leve é dividido em três tabelas, em vez de colocar em uma tabela, estabelecer uma tabela base abstrata para armazenar campos públicos