[英]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。
我在這里使用的庫的版本是這些:
我的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 info
和celery -A bookProjectSetting beat -l INFO
需要同時啟動。 然后,您可以觀察您的任務的運行情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.