2011-01-13 17 views
8

SqlAlchemyを使用してデータベースのバックエンドに接続し、Pythonアプリケーションでマルチプロセッシングを頻繁に使用します。私は、データベースクエリの結果であるオブジェクト参照をあるプロセスから別のプロセスに渡す必要がある状況に遭遇しました。SqlAlchemyとマルチプロセッシング

SqlAlchemyは、オブジェクトの属性にアクセスすると、そのオブジェクトが他のプロセスの現在のセッションに再接続しようとするため、問題が発生します。これは、オブジェクトが他のセッションに接続されているため例外が発生します。

InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148') 

この状況を処理する方法は何ですか?オブジェクトを最初のセッションから切り離したり、オブジェクトをORM関連のものなしで複製することは可能ですか?

+2

私は辞書にそれらを妨害、あなたはそのオブジェクトのうち、必要な属性を取る示唆して はmultprocessingパイプを使用してプロセス間でそれを送っているあなたにオブジェクトをマージしてみました新しいセッション? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge(obj)は、sqlalchemyがobjを忘れるようにします。ただし、後でobjを変更すると、変更はデータベースにコミットされなくなります。 maksymkoの提案は確かに良いです。 – Simon

+0

オブジェクトの属性は、別のデータベースにオブジェクトが格納されていますか?たとえば、それは外部キーかBLOBですか? –

答えて

13

これは悪い考えです。

ロックプリミティブは複数のPythonランタイムで動作しないため、すべての種類の悪いことが起こる可能性があるため、このようなプロセス間でステートフルなオブジェクトを共有しないでください(魅力的です)。ただ、提案を

http://docs.python.org/library/multiprocessing.html#pipes-and-queues

+0

私はこれらのオブジェクトに対してのみ読み取りアクセスが必要です。他のプロセスのオブジェクトからの読み込みも面倒だと思いますか? –

+0

はい、オブジェクトの動作が何であるかを100%確認できないため、 –

+0

は妥当と思われます。ありがとうございました! –

関連する問題