簡體   English   中英

Celery/Redis 無限加載

[英]Celery/Redis infinite loading

在此先感謝,我正在嘗試對 celery 位有點熟悉,我無法解決我的問題,我已經 4 個小時試圖找出問題所在,但我不知道。 今天早上一切正常,但現在我在提交表單時面臨無限加載。

首先,我在拱門上並使用每個 package 的最新版本,這是我從終端獲得的代碼和消息:

配置:

演示/設置/base.py:

INSTALLED_APPS = [
'users.apps.UsersConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'core',
'books',
'django_celery_results',]

 CELERY_RESULT_BACKEND = 'django-db'
 CELERY_BROKER_URL = f'redis://{config("REDIS_HOST")}:{config("REDIS_PORT")}/{config("REDIS_CELERY_DB")}'

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_celery__.sqlite3'),
}
}

.env:

REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_CELERY_DB=0

我的模型書籍/模型:

from django.db import models
from PIL import Image
from django import forms
from demo import tasks


def resize_model(booquin):
    img = Image.open(bouquin.cover.path)

    if img.height > 300 or img.width > 300:
        output_size = (300, 300)
        img.thumbnail(output_size)
        img.save(bouquin.cover.path)
        bouquin.save()


class Bouquin(models.Model):
    titre = models.CharField(max_length=200)
    cover = models.ImageField(upload_to="cover")

def __str__(self):
    return self.titre


 class Bouquin_Form(forms.ModelForm):
    def save(self, commit=True):
        book = super().save(commit)
        tasks.resize_book_celery.apply_async((book.id,))
        return book

     class Meta:
       model = Bouquin
       fields = ["titre", "cover"]

我的 demo/tasks.py (我將模型和 forms 混合在同一個文件中,因為它只是為了測試目的)

from celery import shared_task
from books import models


@shared_task
def resize_book_celery(book_id: int):
    models.resize_model(models.Bouquin.objects.get(id=book_id))

我的演示/celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings.base')

app = Celery('demo')

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

app.autodiscover_tasks()

最后是我的觀點:books/views.py

from django.shortcuts import render, reverse, redirect
from .models import Bouquin, Bouquin_Form
from django.contrib import messages


def create_book(request):
    book_listing = Bouquin.objects.all()

    if request.method == 'POST':
        form = Bouquin_Form(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect("create-book")

    else:
        form = Bouquin_Form()

    context = {"book_listing": book_listing, "form": form}

    return render(request, "demo/book_listing.html", context)

我在 shell 中運行的內容:( sudo systemctl start redis )然后celery -A demo worker -l debug

output:

 -------------- celery@laptop v4.4.6 (cliffs)
 --- ***** ----- 
 -- ******* ---- Linux-5.7.9-arch1-1-x86_64-with-glibc2.2.5 2020-07-20 17:23:51
 - *** --- * --- 
 - ** ---------- [config]
 - ** ---------- .> app:         demo:0x7f0d73fd67c0
 - ** ---------- .> transport:   redis://localhost:6379/0
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 4 (prefork)
 -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
  -------------- [queues]
            .> celery           exchange=celery(direct) key=celery

celery花-A演示

[I 200720 17:26:27 command:138] Visit me at http://localhost:5555
[I 200720 17:26:27 command:145] Broker: redis://localhost:6379/0
[I 200720 17:26:27 command:146] Registered tasks: 
['celery.accumulate',
 'celery.backend_cleanup',
 'celery.chain',
 'celery.chord',
 'celery.chord_unlock',
 'celery.chunks',
 'celery.group',
 'celery.map',
 'celery.starmap',
 'demo.tasks.resize_book_celery']

當我提交表單時,我得到了無休止的加載,沒有錯誤消息,並且在花的儀表板中什么也沒有。 今天早上工作正常,我首先以為我在保存時弄亂了代碼,但我在不同的虛擬環境中從頭開始重寫了兩次,我得到了相同的結果,我還從 arch 存儲庫重新安裝了 redis。 由於我對 celery/redis 不太了解,所以我認為有一些任務在隊列中等待阻塞其他任務,所以我輸入了一些命令來清除,但沒有任何幫助,如果你有線索,請提前感謝!

我已經用超基本的 function 進行了測試,如下所示:

@task
def time_celery(x):
    return x ** 2
  • def 乘法視圖(請求):

     result = time_celery.delay(2) context = {"result": result} return render(request, "demo/multiplications.html", context)

而且我得到了同樣的無盡加載,所以我認為 redis 肯定有問題,我想我要把我的電腦恢復到今天早上 state 拋出 rsync

切換到 rabbitmq 並且它似乎可以完美地工作,CELERY_BROKER_URL = 'amqp://localhost' + 啟用服務器就像這里解釋的https://wiki.archlinux.org/index.php/RabbitMQ#Installation

要刪除所有 Redis 數據庫的所有數據/鍵,請使用 FLUSHALL 命令。 打開終端並輸入

redis-cli FLUSHALL

我認為這個問題是針對 redis 的。

暫無
暫無

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

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