我在python中使用多处理和访问数据库的代码。它大部分时间都能正常工作,但有时会产生错误。该错误最初是
File "/usr/lib/python2.7/multiprocessing/pool.py", line 528, in get
raise self._value
pg.OperationalError: can't rollback
或
File "/usr/lib/python2.7/multiprocessing/pool.py", line 528, in get
raise self._value
pg.InternalError: SSL SYSCALL error: EOF detected
我用来访问数据库的代码是
def getRecords(db,query):
cur=db.cursor()
cur.execute(query)
types=getTypes(cur.description)
columns=getColumns(cur.description)
rows=cur.fetchall()
cur.close()
try:
db.commit()
except:
db.rollback()
多处理通过以下方式完成:
po = multiprocessing.Pool()
for an_element in a_list:
for an_object in a_list_of_objects:
results.append(po.apply_async(the_multiprocessed_function, (an_element, an_object)))
po.close()
po.join()
for r in results:
some_function_of(r.get())
我想知道我是否在跨进程共享连接,但对于每个多进程函数,我创建了我的新连接(conn = pgdb.connect(...))并关闭它(conn.close())。< / p>
然后,我想知道它是否与我给我的多处理函数的参数有关,特别是因为它们是我自己定义的类实例,但为什么这会在pg中产生错误?
很抱歉,如果我的问题不是很清楚,但我不知道在哪里查找错误。多处理与较小的实例和其他表一起工作得很好,并且已经过测试。但是当在查询中更改一个表并运行代码以解决更大的问题时,我在某个地方达到了一些限制。
答案 0 :(得分:4)
实际上,这个错误与多处理无关,而只与postgresql / pgrouting中计算最短路径的函数有关。当没有路径连接网络中的两个点时,该功能与数据库断开连接,没有任何解释。有关详情,请参阅psycopg2.InterfaceError: connection already closed / pgr_astar。