Lý lịch:
Tôi đang làm một dự án sử dụng Django với cơ sở dữ liệu Postgres. Chúng tôi cũng đang sử dụng mod_wsgi trong trường hợp quan trọng, vì một số tìm kiếm trên web của tôi đã đề cập đến nó. Khi gửi biểu mẫu web, chế độ xem Django bắt đầu một công việc sẽ mất một lượng thời gian đáng kể (nhiều hơn người dùng muốn đợi), vì vậy chúng tôi bắt đầu công việc thông qua lệnh gọi hệ thống trong nền. Công việc hiện đang chạy cần có khả năng đọc và ghi vào cơ sở dữ liệu. Vì công việc này mất quá nhiều thời gian nên chúng tôi sử dụng đa xử lý để chạy song song các phần của nó.
Vấn đề:
Tập lệnh cấp cao nhất có kết nối cơ sở dữ liệu và khi nó tạo ra các quy trình con, có vẻ như kết nối của cha mẹ có sẵn cho các con. Sau đó, có một ngoại lệ về cách SET TRANSACTION ISOLATION LEVEL phải được gọi trước một truy vấn. Nghiên cứu đã chỉ ra rằng điều này là do cố gắng sử dụng cùng một kết nối cơ sở dữ liệu trong nhiều quy trình. Một luồng tôi tìm thấy đã đề xuất gọi connect.close () khi bắt đầu các quy trình con để Django sẽ tự động tạo kết nối mới khi nó cần và do đó mỗi quy trình con sẽ có một kết nối duy nhất - tức là không được chia sẻ. Điều này không hiệu quả đối với tôi, vì việc gọi connect.close () trong tiến trình con khiến quy trình mẹ phàn nàn rằng kết nối bị mất.
Những phát hiện khác:
Một số nội dung tôi đã đọc dường như chỉ ra rằng bạn thực sự không thể làm điều này và đa xử lý, mod_wsgi và Django không hoạt động tốt với nhau. Tôi đoán điều đó có vẻ khó tin.
Một số đề xuất sử dụng cần tây, đây có thể là một giải pháp lâu dài, nhưng tôi không thể cài đặt cần tây vào lúc này, đang chờ một số quy trình phê duyệt, vì vậy không phải là một tùy chọn ngay bây giờ.
Tìm thấy một số tài liệu tham khảo trên SO và những nơi khác về các kết nối cơ sở dữ liệu liên tục, mà tôi tin rằng đó là một vấn đề khác.
Cũng tìm thấy các tham chiếu đến psycopg2.pool và pgpool và một cái gì đó về bouncer. Phải thừa nhận rằng tôi không hiểu hầu hết những gì tôi đang đọc trên đó, nhưng nó chắc chắn không làm tôi ngạc nhiên như những gì tôi đang tìm kiếm.
"Công việc xung quanh" hiện tại:
Hiện tại, tôi đã hoàn nguyên để chỉ chạy mọi thứ theo thứ tự và nó hoạt động, nhưng chậm hơn tôi muốn.
Bất kỳ đề xuất nào về cách tôi có thể sử dụng đa xử lý để chạy song song? Có vẻ như nếu tôi có thể để cha mẹ và hai đứa trẻ đều có kết nối độc lập với cơ sở dữ liệu, mọi thứ sẽ ổn, nhưng tôi dường như không thể có được hành vi đó.
Cảm ơn, và xin lỗi vì độ dài!