使用烧瓶进行多处理 sqlcellhe - psycopg2.数据库错误:状态PGRES_TUPLES_OK错误,lib



在尝试将多处理与烧瓶SQLllchemy一起使用时出现以下异常。

sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically.
[12/Aug/2019 18:09:52] "GET /api/resources HTTP/1.1" 500 -
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/SQLAlchemy-1.3.6-py3.7-linux-x86_64.egg/sqlalchemy/engine/base.py", line 1244, in _execute_context
cursor, statement, parameters, context
File "/usr/local/lib/python3.7/site-packages/SQLAlchemy-1.3.6-py3.7-linux-x86_64.egg/sqlalchemy/engine/default.py", line 552, in do_execute
cursor.execute(statement, parameters)
psycopg2.DatabaseError: error with status PGRES_TUPLES_OK and no message from the libpq

没有多处理,代码工作得很好,但是当我添加如下多处理时,遇到了这个问题。

worker = multiprocessing.Process(target=<target_method_which_has_business_logic_with_DB>, args=(data,), name='PROCESS_ID', daemon=False)
worker.start()
return Response("Request Accepted", status=202)

我在 SO (https://stackoverflow.com/a/33331954/8085047) 中看到类似问题的答案,建议使用 engine.dispose(),但就我而言,我直接使用 db.session,而不是手动创建引擎和范围。

请帮助解决问题。谢谢!

我遇到了同样的问题。跟随山姆的链接帮助我解决了它。

在我之前(不工作):

from multiprocessing import Pool
with Pool() as pool:
pool.map(f, [arg1, arg2, ...])

这对我有用:

from multiprocessing import get_context
with get_context("spawn").Pool() as pool:
pool.map(f, [arg1, arg2, ...])

dibrovsd@github的回答对我来说非常有用。如果您使用的是像uwsgi或gunicorn这样的PREFORKING服务器,这也将为您提供帮助。

在此处发布他的评论供您参考。

发现。当 uwsgi(或 gunicorn)启动时,会发生这种情况,当多个工作线程从第一个进程分叉时。
如果第一个进程启动时有请求,则会打开一个数据库连接,并将连接分叉到下一个进程。但是在数据库中,当然,没有打开新的连接,并且发生了断开的连接.
您必须指定 lazy:true,lazy-apps:true (uwsgi) 或 preload_app = False (gunicorn)
在这种情况下,添加。 工人不分叉,而是自己运行并打开正常连接

参考链接:https://github.com/psycopg/psycopg2/issues/281#issuecomment-985387977

相关内容

  • 没有找到相关文章

最新更新