djangocelery 无法在任务内查询postgres db

2cmtqfgy  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(654)

在我的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 产量:

所以看起来celery 起作用了,但不知怎么的,我不能向我的发帖数据库发问。我现在正在windows机器上开发。。。有人能帮我吗?
编辑:我用以下命令行开始celery :

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

xzlaal3s1#

我找到了windows的解决方案:我用以下命令启动celery :

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

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

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

我不是Maven,我想我在教程中看到了--pool=eventlet,所以我用了它。但是用--pool=solo就行了。
在这里我发现了一篇关于不同泳池选项的文章,也许它也能帮助其他人:https://www.distributedpython.com/2018/10/26/celery-execution-pool/

相关问题