【问题标题】:Django Celery cannot query postgres db inside taskDjango Celery 无法在任务中查询 postgres db
【发布时间】:2020-12-19 00:37:16
【问题描述】:

在我的 celery 任务中,我尝试查询我的 postgres 数据库。但我总是收到以下错误:

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)

遵循简单的方案:

如果我更改我的 task.py 并只执行一个简单的 for 循环。

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'

芹菜产量:

所以看起来 celery 正在工作,但不知何故我无法对我的 postgres 数据库进行查询。我目前正在开发一台 Windows 机器...有人可以帮帮我吗?

编辑:我使用以下命令行启动 celery:

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

【问题讨论】:

  • stackoverflow.com/questions/60179472/… 查看接受的答案,它说这与 Windows 操作系统有关,请使用基于 L*Nux 的操作系统。
  • 感谢链接,我想我昨天也看到了。我的问题是,目前我无法访问 linux 机器。所以我正在寻找 Windows 操作系统上的解决方案。

标签: python django postgresql redis celery


【解决方案1】:

我找到了适用于 Windows 的解决方案: 我用以下命令开始我的芹菜:

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

问题似乎是 --pool=eventlet --> 如果我将 pool 更改为 solo 它可以工作。 现在可以使用以下命令,我可以进行 postgres 查询。

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

我不是专家,我想我在教程中看到了 --pool=eventlet,所以我使用了它。但是使用 --pool=solo 就可以了。

在这里我找到了一篇关于不同池选项的文章,也许它也对其他人有所帮助:https://www.distributedpython.com/2018/10/26/celery-execution-pool/

【讨论】:

    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2013-10-09
    • 2019-06-07
    • 2017-04-04
    • 2016-08-13
    相关资源
    最近更新 更多