簡體   English   中英

Django Celery Beat 在 Django 中使用 Celery 執行定期任務不起作用

[英]Django Celery Beat for periodic task in Django with Celery is not working

我想將芹菜添加到我的 Django 項目中。 但不知何故,盡管我按照官方文檔中的步驟操作,但它似乎並沒有按預期工作。 以下是我的 Django 項目的部分內容:

# celery.py

import os

from celery import Celery
from celery.schedules import crontab

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookProjectSetting.settings')

app = Celery('bookProjectSetting')

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

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

app.conf.beat_schedule = {
    'update-lifetime': {
        'task': 'tasks.update_life_time_of_books',
        'schedule': crontab(minute='*/5'),
       
    },
}

然后是init文件:

# __init__.py 
from .celery import app as celery_app

__all__ = ('celery_app',)

現在,在我的應用程序文件夾(稱為books )中, tasks.py如下所示:

from books.models import Book 
from celery import shared_task  

@shared_task
def update_life_time_of_books():
    # Query all the books in our database
    print("Query all books.")
    books = Book.objects.all()

    # do sth. with books. for the sake of brevity I do not show this

在我的settings.py文件中,我有這個芹菜:

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_TIMEZONE = 'Europe/Berlin'

# ... bla bla

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django_celery_beat',
    'rest_framework', 
    'books',

]

我通過redis-server命令在第二個選項卡中啟動了 redis 服務器,以便它可以充當代理。 我還通過python manage.py runserver啟動了我的 django 服務器。 最后,我通過以下命令啟動了工作程序:

celery -A bookProjectSetting beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler

但結果我得到了這個:

celery beat v5.0.1 (singularity) is starting.
__    -    ... __   -        _
LocalTime -> 2020-10-23 13:56:29
Configuration ->
    . broker -> redis://localhost:6379//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> django_celery_beat.schedulers.DatabaseScheduler

    . logfile -> [stderr]@%INFO
    . maxinterval -> 5.00 seconds (5s)
[2020-10-23 13:56:29,666: INFO/MainProcess] beat: Starting...
[2020-10-23 14:00:00,021: INFO/MainProcess] Scheduler: Sending due task update-lifetime (tasks.update_life_time_of_books)

因此,似乎任務在 5 分鍾后發送,因為我在celery.py使用 crontab celery.py (見上文),但例如,我的任務函數(見上文)中的print("Query all books.")沒有執行. 所以,我假設我的任務沒有執行。 為什么??? 我必須說官方文檔沒有明確的例子,我發現的東西/文章只能與 celery 3 或 4 一起使用。我使用的是 celery 5。

我在這里使用的庫的版本是這些:

  • 芹菜==5.0.1
  • 姜戈==3.1.2
  • django-celery-beat==2.1.0
  • Redis==3.5.3

我的django項目文件夾結構如下:

bookProject
  |
  |_bookProjectSetting
  |    |_init.py
  |    |_asgi.py
  |    |_celery.py
  |    |_settings.py
  |    |_urls.py
  |    |_wsgi.py
  |
  |_books
  |   |_init.py
  |   |_admin.py
  |   |_apps.py
  |   |_models.py
  |   |_serializers.py
  |   |_tasks.py
  |   |_tests.py
  |   |_urls.py
  |   |_views.py
  |
  |_env
  |_db.sqlite3
  |_dumb.rdb
  |_manage.py

celery -A bookProjectSetting worker -l infocelery -A bookProjectSetting beat -l INFO需要同時啟動。 然后,您可以觀察您的任務的運行情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM