Django Celery, görev içinde postgres db'yi sorgulayamaz

Aug 31 2020

Kereviz görevimde postgres db'yi sorgulamaya çalışıyorum. Ama her zaman aşağıdaki hatayı alıyorum:

task.py
@shared_task(bind=True)
def ImportFiles(self, activity_file_list, user_id_list,activityfile_id,file_type_list):
    print('Task ImportFiles started')
    myuser = User.objects.get(pk=user_id_list[0])
    print("USER:")
    print(myuser)

settings.py
INSTALLED_APPS = [
...
    'celery',
...
]
...
DATABASES = {
'default': {
     'ENGINE': 'django.contrib.gis.db.backends.postgis',
     'NAME': 'geodjango',
     'USER': 'postgres',
     'PASSWORD': 'postgres',
},
}

...

CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379'

celery.py
# Default settings from celery tutorial:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'geodjango.settings')
app = Celery('geodjango', broker='redis://localhost')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

Aşağıdaki kolay senaryo işe yarar:

Task.py'yi değiştirirsem ve sadece basit bir for döngüsü çalıştırırsam.

task.py
@shared_task(bind=True)
def ImportFiles(self, activity_file_list, user_id_list,activityfile_id,file_type_list):
    print('Task ImportFiles started')
    progress_recorder = ProgressRecorder(self)
    result = 0
    seconds = 10
    for i in range(seconds):
        print("for: " + str(i))
        time.sleep(1)
        result += i
        progress_recorder.set_progress(i + 1, seconds, description="Downloading")
    print("FOR LOOP FINISHED")
    return 'Task Complete'

Kereviz çıkışı:

Yani kereviz çalışıyor gibi görünüyor, ancak bir şekilde postgres db'ye sorgu yapamıyorum. Şu anda bir Windows makinesinde devoling yapıyorum ... Biri bana yardım edebilir mi?

Düzenleme: Kerevizi aşağıdaki komut satırıyla başlatıyorum:

celery -A geodjango.celery worker --loglevel=info --pool=eventlet

Yanıtlar

1 xFL Sep 01 2020 at 01:30

Pencereler için bir çözüm buldum: Kerevizime şu komutla başladım:

celery -A geodjango.celery worker --loglevel=info --pool=eventlet

Sorun, havuzu solo olarak değiştirirsem --pool = eventlet -> gibi görünüyor. Şu anda aşağıdaki komut çalışıyor ve postgres sorgularımı yapabiliyorum.

celery -A geodjango.celery worker --loglevel=info --pool=solo

Uzman değilim, sanırım bir öğreticide --pool = eventlet gördüm, bu yüzden onu kullandım. Ancak --pool = solo ile çalışır.

Burada farklı havuz seçenekleri hakkında bir makale buldum, belki başka birine de yardımcı olabilir: https://www.distributedpython.com/2018/10/26/celery-execution-pool/