最近,我将正在使用的软件的某些后台功能从使用Python线程模块转换为多处理模块,以便利用更多的CPU内核。大部分传输工作顺利进行,但是数据库集成给我带来了重大问题。
最初,我使用的是来自Python psycopg2的单个SimpleConnectionPool对象,该对象作为名为db的模块中的全局变量,该模块还处理一些样板数据库操作。据我了解,创建第二个Python进程只是将当前的内存堆栈复制到新的进程位置。因为这会导致数据库连接出现问题,所以我在db模块中添加了一个名为init()的函数,该函数只是简单地重新初始化SimpleConnectionPool并将其设置为全局变量。我的想法是,如果我从第二个进程中调用此init函数,它将仅为第二个进程中的池创建一组新的连接。因此,主流程将保持自己的连接集,与第二个流程分开。
但是,使用这种方法,我经常遇到以下异常:
OperationalError: SSL error: decryption failed or bad record mac
这直接源自psycopg2_patcher.py中的“ state = conn.poll()”。我做了一点挖掘,据我所知,仅当主流程和辅助流程都尝试同时执行查询时,才会引发错误。我当时只是想在主流程中恢复到一个连接池,然后使用队列将查询从辅助流程传递到主流程以执行。尽管我宁愿避免,但这也会带来很多头痛。
我还尝试在次要进程中远离连接池,并使用了仅在需要执行查询时建立的单个连接,然后在此之后直接关闭。当主进程尝试在大约同一时间执行查询时,会发生相同的错误。
我需要对PGSQL服务器或我的实现做些什么,以允许不同的进程以相同的凭据同时发布查询?我感觉到我正在以一种完全不必要和复杂的方式来处理进程之间的数据库连接。
答案 0 :(得分:0)
我在这里对这个问题有一个很好的答案。您可以在其中指定连接数,并为您处理所有异步连接。这是ThreadedConnectionPool的修改版本。