celery, 數據庫分表

celery異步任務

文件被執行時, 文件所在的目錄會被添加到環境變量中python

經過"."進行相對導入時, 導入語句所在的文件不能爲執行文件redis

經過腳本添加任務

'''
# ...\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)
'''

啓動新的beat服務添加任務

'''
# ...\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服務
'''

數據庫分表

免費課, 實戰課, 輕課分三張表, 而不是放在一張表中, 創建抽象基表存放公共字段數據庫

相關文章
相關標籤/搜索