我試圖使用multiprocessing
模塊更新數據庫(異步方式)上的一行。我的代碼有一個簡單的函數create_member
,它在表上插入一些數據,然後創建一個可能會改變這些數據的進程。問題是,傳遞給async_create_member
會話關閉數據庫連接,以及接下來的徵用我得到psycopg的錯誤:Python SQLAlchemy更新Postgres記錄
(Interface Error) connection already closed
下面的代碼:
def create_member(self, data):
member = self.entity(**data)
self.session.add(member)
for name in data:
setattr(member, name, data[name])
self.session.commit()
self.session.close()
if self.index.is_indexable:
Process(target=self.async_create_member,
args=(data, self.session)).start()
return member
def async_create_member(self, data, session):
ok, data = self.index.create(data)
if ok:
datacopy = data.copy()
data.clear()
data['document'] = datacopy['document']
data['dt_idx'] = datacopy['dt_idx']
stmt = update(self.entity.__table__).where(
self.entity.__table__.c.id_doc == datacopy['id_doc'])\
.values(**data)
session.begin()
session.execute(stmt)
session.commit()
session.close()
我可能通過創建一個解決這個問題在async_create_member
新引黃,但這留下的Postgres太多idle
交易:
engine = create_new_engine()
conn = engine.connect()
conn.execute(stmt)
conn.close()
什麼建議立即進行刪除我現在做什麼?有沒有辦法解決第一個代碼?或者我應該不斷創建與create_new_engine
函數的新連接?我應該使用線程還是進程?
我相信如果你刪除'self.session.close()'在create_member功能它應該工作 – user2097159 2014-11-14 18:52:14
已經嘗試過。沒有成功 – user1538560 2014-11-14 19:33:08
嗯,這很奇怪,你應該得到這個異常的唯一原因是因爲你關閉了與服務器的連接。我也認爲你不需要begin()。我假設你在session.execute(stmt)行中出現這個錯誤? – user2097159 2014-11-14 19:38:16