Django Celery 无法在任务中查询 postgres 数据库
Django Celery cannot query postgres db inside task
在我的 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 -A geodjango.celery worker --loglevel=info --pool=eventlet
我找到了 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/
在我的 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 -A geodjango.celery worker --loglevel=info --pool=eventlet
我找到了 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/