iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

Django系列 第 21

Day21~Django 漫漫長路- 油條配豆漿,Celery配Redis part2

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天要來講解是如何透過celery使用redius進行排程/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


settings.py設定

timezone 如果今天django時區是台北(預設UTC)

LANGUAGE_CODE = "en-us"

TIME_ZONE = "Asia/Taipei"

USE_I18N = True

USE_L10N = True

USE_TZ = False

Celery設定

django-celery-beat==2.5.0
django-celery-results==2.5.1
celery==5.2.7
這邊版本參考,如太舊的版本celery可能會遇到contab設定時間的問題

# test for cache using redis
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    },
}

# Celery settings
CELERY_BROKER_URL = "redis://127.0.0.1:6379/0"

#將時區更改為TAIPEI
CELERY_ENABLE_UTC = False
TIME_ZONE = "Asia/Taipei"
#django_celery_beat的clockedschedule任務是默認是用UTC時區的
DJANGO_CELERY_BEAT_TZ_AWARE = False

CELERY_TASK_TIME_LIMIT = 5

# django-cache to tasks result and status
CELERY_RESULT_BACKEND = "django-db"
# celery content format
CELERY_ACCEPT_CONTENT = [
    "application/json",
]
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"

CELERY_RESULT_EXTENDED = True

CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"

task任務執行contab

contab 設定定期任務,圖下test_task2代表tapie時間1700會執行test_task1任務
interval 設定多少秒執行一次,圖下test_task2為一分鐘執行一次的任務

CELERY_BEAT_SCHEDULE = {
    contab
    "test_task1": {
        "task": "website.tasks.test_task",
        "schedule": crontab(minute=0, hour=17),
    },
    intervals
    "test_task2": {
        "task": "website.tasks.test_task",
        "schedule": 60
    },
}

執行migrate

執行完會長出celery相關的table

python manage.py migrate

add celery.py

mysite/mysite/celery.py

import os
from celery import Celery
import datetime

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

app = Celery("mysite")

app.config_from_object("django.conf:settings", namespace="CELERY")

app.autodiscover_tasks()

add tasks.py

website/tasks.py

from celery import Celery
from celery import shared_task
import datetime

app = Celery("django_practice")

@shared_task()
def test_task():
    return 'finish:' + str(datetime.datetime.now())

add two terminal

預設的 concurrency 值為機器的 CPU 核心數量
可以用 -l 或 --loglevel 參數指定輸出記錄的層級為 INFO 或 DEBUG
Eventlet & Gevent 池使用協程 來執行任務,不是產生傳統線程. 能夠同時處理多個任務

需先開worker再開beat,任務時程較不會有誤差

Celery -A mysite worker --concurrency=4 -l info -P eventlet

關於排程時間

celery -A mysite beat

今天執行celery的排程任務,接下來我們來講解celery的多進程的異步方法
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day20~Django 漫漫長路- 油條配豆漿,Celery配Redis part1
下一篇
Day22~Django 漫漫長路- 如何使用api來達到異步任務執行task
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言