Tôi có ứng dụng Flask chạy dưới Gunicorn, sử dụng loại nhân viên đồng bộ với 20 quy trình công nhân. Ứng dụng đọc rất nhiều dữ liệu khi khởi động, cần thời gian và sử dụng bộ nhớ. Tồi tệ hơn, mỗi quá trình tải bản sao của riêng nó, làm cho nó mất nhiều thời gian hơn và mất 20X bộ nhớ. Dữ liệu tĩnh và không thay đổi. Tôi muốn tải nó một lần và có tất cả 20 công nhân chia sẻ nó.Chia sẻ dữ liệu toàn cầu tĩnh giữa các quy trình trong ứng dụng Gunicorn/Flask
Nếu tôi sử dụng cài đặt preload_app
, nó chỉ tải trong một chuỗi và ban đầu chỉ mất bộ nhớ 1X, nhưng sau đó dường như phải chuyển sang 20X khi yêu cầu bắt đầu. Tôi cần truy cập ngẫu nhiên vào dữ liệu, vì vậy tôi ' d thay vì không làm IPC.
Có cách nào để chia sẻ dữ liệu tĩnh giữa các quy trình Gunicorn không?
Tôi đoán có lẽ đã nói rằng tôi muốn chia sẻ một dict Python bình thường, không chỉ là một blob bộ nhớ. –
@DoctorJ Sau đó, bạn ra khỏi may mắn. Lý do là một cấu trúc dữ liệu Python chỉ là con trỏ đến con trỏ trong bộ nhớ, mà sẽ kéo dài nhiều trang. Hầu hết các trang đó cũng sẽ được chia sẻ với dữ liệu được ghi vào, do đó sao chép trên ghi làm cho các trang được sao chép trong mỗi quá trình. Tôi khuyên bạn nên sử dụng một cửa hàng đối tượng hoặc kho khóa-giá trị như Redis - đây là giải pháp "chuẩn" cho vấn đề này ngày nay. IPC trên localhost rất nhanh, có thể bạn đang tối ưu hóa sớm nếu bạn nghĩ rằng đó sẽ là nút cổ chai. – aaa90210