2012-03-31 32 views
7

Tôi có một ứng dụng python đa quy trình (các quá trình được sinh ra bởi uwsgi) cần lưu các biến trong RAM, sau đó đọc và cập nhật các biến đó từ nhiều quy trình khác nhau. Tôi biết có rất nhiều tùy chọn bộ nhớ đệm có sẵn, nhưng tất cả những tùy chọn tôi tìm thấy chỉ có thể lưu trữ chuỗi. Có thể cho các quy trình python khác nhau truy cập cùng một bộ nhớ ảo, và do đó chia sẻ dữ liệu mà không bao giờ chuyển đổi nó hay thậm chí sao chép nó?Quy trình python có thể chia sẻ các đối tượng trực tiếp không?

+0

bản sao có thể có của [Bộ nhớ chia sẻ hệ thống V bằng Python?] (Http://stackoverflow.com/questions/2219604/system-v-shared-memory-in-python) – Amber

+0

Kiểm tra [xử lý] (http: //pypi.python.org/pypi/processing). – Keith

+0

Tôi đã kiểm tra cả hai. sysv_ipc chỉ lưu trữ các chuỗi, và 'xử lý' sẽ không hoạt động bởi vì các tiến trình được sinh ra bởi uwsgi, không phải python. –

Trả lời

6

Bên cạnh POSH, Python Shared Objects,, ít nhất là một phần của những gì bạn muốn làm (đặt đối tượng Python trong bộ nhớ chia sẻ SvsV-IPC và sửa đổi chúng từ nhiều quy trình) và có thể làm điểm bắt đầu phát triển mô-đun mở rộng của riêng bạn sự cần thiết bạn có với các quy trình máy chủ được tạo ra bằng wsgi, không có nhiều thứ khác trong thế giới Python (mà tôi biết ...) không phụ thuộc vào các đối tượng tẩy/giải nén khi chia sẻ chúng giữa các tiến trình.

Một điều khác cũng có trong đầu là Pyro, chia sẻ qua kết nối mạng tùy ý giữa các quy trình (vì vậy, cũng có thể chia sẻ qua các ổ cắm miền Unix) và trải nghiệm linh hoạt hơn multiprocessing có thể cung cấp cho (proxy) quản lý đối tượng.

Những gì bạn cũng có thể xem là liệu bạn có thể nhận được máy chủ web đang thúc đẩy ứng dụng WSGI của bạn đến các quy trình không phải ngã ba, mà là sử dụng luồng; theo cách này, bạn chỉ cần sử dụng dữ liệu chung của Python cho bộ nhớ cache đối tượng được chia sẻ mà sau đó bạn có thể truy cập từ tất cả các trình xử lý WSGI được sinh ra. Một WSGI-server luồng là ví dụ như CherryPy-builtin wsgiserver, mà tôi đang sử dụng cho một dự án có chính xác nhu cầu bạn đang có. mod_wsgi cũng hoạt động cho ngữ cảnh của bạn trong trường hợp bạn định cấu hình Apache với MPM của nhân viên (để các luồng Apache và không chia rẽ các quy trình mới).

Nếu tất cả những thứ đó không phải là một lựa chọn, cách trích xuất quy trình thực tế bạn đang làm trong máy chủ web sang một quy trình bên ngoài, các trang web liên lạc với một số cơ chế RPC để đẩy yêu cầu công việc và kéo dữ liệu? Máy chủ xử lý "backend" có thể là một quá trình Python đa luồng đơn giản, cung cấp giao diện XML-RPC thông qua thư viện chuẩn SimpleXMLRPCServer hoặc một số thứ tương tự.

+0

Tôi không thể kiểm tra điều này ngay bây giờ vì máy tính của tôi đang được sửa chữa, nhưng tôi nghĩ rằng luồng là câu trả lời tôi đang tìm kiếm. Tôi đã không rõ ràng trước đây: máy chủ là uWSGI, mà tôi khá chắc chắn có thể sử dụng chủ đề thay vì forking. Tôi không biết điều đó sẽ ảnh hưởng như thế nào đến hiệu suất, nhưng đó là một câu hỏi khác. –

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