我正在一个 django 应用程序中对我的芹菜工人运行任务,每个任务大约需要 1-2 秒才能执行。通常这些执行很好,但有时,特别是如果 Django 应用程序已经部署了一段时间,我开始看到这样的错误:
File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 428, in __init__
self.__connect(first_connect_check=True)
File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 630, in __connect
connection = pool._invoke_creator(self)
File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 453, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/lib64/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: remaining connection slots are reserved for non-replication superuser connections
这向我表明芹菜工人没有正确关闭连接。
发生此错误时,我检查了数据库上的空闲连接计数 - 肯定还剩下一些连接,因此未达到数据库的最大连接限制。
我的问题:如何确保芹菜工人正在关闭数据库连接?
芹菜设置:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings')
_celery_broker = settings.CELERY_BROKER
_result_backend = settings.RESULT_BACKEND
app = Celery('my_proj', broker=_celery_broker, backend=_result_backend)
app.autodiscover_tasks(['common'])
app.conf.update(
worker_prefetch_multiplier=0,
event_queue_ttl=0,
task_acks_late=True,
)
我的 Django 数据库设置:
'DATABASES': {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': <...>,
'USER': <...>,
'PASSWORD': <...>,
'HOST': <...>,
'PORT': 5480,
}
}
如何启动已部署的 Django 服务器
gunicorn --config gunicorn.config my_proj.wsgi:application
古尼角兽配置
bind = '0.0.0.0:8201'
workers = 3
worker_class = 'gthread'
threads = 3
limit_request_line = 0
timeout = 1800
我如何开始我的芹菜工人:
celery -A my_proj worker -l info
我在 Django 文档中读到,如果未指定,则MAX_CONN_AGE设置默认为 0,据我了解,芹菜工人也应该选择它。
可能如果您可以开始池化或故意启动并关闭可能会有所帮助的连接。通过这个 https://code.i-harness.com/en/q/2263d77 讨论是关于 dB 连接池和为芹菜任务创建/关闭连接。我自己还没有尝试过。