2011-01-13 4 views
8

J'utilise SqlAlchemy pour me connecter au backend de ma base de données et faire un usage intensif du multitraitement dans mon application Python. Je suis arrivé à une situation qui nécessite de passer une référence d'objet, qui est le résultat d'une requête de base de données, d'un processus à un autre. C'est un problème, car lors de l'accès à un attribut de l'objet, SqlAlchemy tente de rattacher l'objet dans la session en cours de l'autre processus, qui échoue avec une exception, car l'objet est attaché dans une autre session:SqlAlchemy et Multiprocessing

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

Quelle est la façon de gérer cette situation? Est-il possible de détacher l'objet de la première session ou de cloner l'objet sans les éléments liés à ORM?

+2

Juste une suggestion: avez-vous essayé de fusionner l'objet en la nouvelle session? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) fait que sqlalchemy oublie obj. Cependant, si vous modifiez obj par la suite, les modifications ne sont plus validées dans la base de données. La suggestion de maksymko est certainement meilleure. – Simon

+0

L'attribut sur l'objet est-il une autre base de données stockée objet? Par exemple est-ce une clé étrangère ou un blob? –

Répondre

13

Ceci est une mauvaise idée (tm). Vous ne devez pas partager un objet avec état entre des processus comme celui-ci (je sais que c'est tentant) car toutes sortes de mauvaises choses peuvent arriver puisque les primitives de verrouillage ne sont pas destinées à fonctionner sur plusieurs runtimes python.

je suggère de prendre les attributs dont vous avez besoin de cet objet, les brouillage dans un dict et envoyer tous les processus utilisant Pipes multprocessing:

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

+0

J'ai seulement besoin d'un accès en lecture sur ces objets. Pensez-vous que même lire des objets d'autres processus est désordonné? –

+0

Oui, car vous ne pouvez pas être sûr à 100% du comportement de l'objet –

+0

Semble raisonnable. Je vous remercie! –