微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django Celery无法在任务内部查询postgres db

如何解决Django Celery无法在任务内部查询postgres db

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

enter image description here

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,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'

芹菜输出

enter image description here

因此,看来celery正在运行,但是以某种方式我无法对我的postgres数据库进行查询。我目前正在Windows机器上进行开发...有人可以帮助我吗?

编辑:我用以下命令行开始celery:

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

解决方法

我找到了Windows的解决方案: 我用以下命令启动芹菜:

struct TestView: View {
    var body: some View {
        VStack {
            ForEach(0...10,id: \.self) { i in
                Color.gray.frame(height: 0.5)
                Text("\(i)")
            }
        }
    }
}

如果我将pool更改为solo,问题似乎是--pool = eventlet->。 以下命令现已生效,我可以进行postgres查询。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。