2011-01-13 31 views
8

Tôi sử dụng SqlAlchemy để kết nối với backend cơ sở dữ liệu của mình và sử dụng nhiều khả năng đa xử lý trong ứng dụng Python của tôi. Tôi đã đến một tình huống mà yêu cầu phải vượt qua một tham chiếu đối tượng, đó là kết quả của một truy vấn cơ sở dữ liệu, từ một tiến trình này sang tiến trình khác. Đây là một vấn đề, bởi vì khi truy cập vào một thuộc tính của đối tượng, SqlAlchemy trys để reattach đối tượng vào phiên hiện tại của quá trình khác, mà không có ngoại lệ, bởi vì đối tượng được đính kèm trong một phiên khác:SqlAlchemy và Multiprocessing

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

Cách xử lý tình huống này là gì? Có thể tách đối tượng khỏi phiên đầu tiên hoặc sao chép đối tượng mà không có các công cụ liên quan đến ORM không?

+2

Chỉ cần một gợi ý: Bạn đã cố gắng kết hợp các đối tượng vào phiên mới? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

phiên.expunge (obj) làm cho sqlalchemy quên về obj. Tuy nhiên, nếu bạn thay đổi obj sau đó, các thay đổi không được cam kết với cơ sở dữ liệu nữa. đề nghị của maksymko chắc chắn là tốt hơn. – Simon

+0

Thuộc tính trên đối tượng có phải là một đối tượng lưu trữ cơ sở dữ liệu khác không? Ví dụ như nó là một chìa khóa nước ngoài hay một đốm màu? –

Trả lời

13

Đây là một ý tưởng tồi (tm). Bạn không nên chia sẻ một đối tượng stateful giữa các quá trình như thế này (tôi biết nó là hấp dẫn) bởi vì tất cả các loại điều xấu có thể xảy ra kể từ khóa nguyên thủy không có ý định làm việc trên nhiều runtimes python.

Tôi đề nghị dùng các thuộc tính bạn cần phải ra ngoài của đối tượng đó, gây nhiễu chúng thành một dict và gửi nó qua quá trình sử dụng ống multprocessing:

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

+0

Tôi chỉ cần truy cập đọc trên các đối tượng này. Bạn có nghĩ rằng ngay cả đọc từ các đối tượng của các quá trình khác là lộn xộn? –

+0

Có, bởi vì bạn không thể chắc chắn 100% hành vi của đối tượng sẽ là –

+0

Âm thanh hợp lý. Cảm ơn bạn! –

Các vấn đề liên quan