2011-10-11 32 views
5

Tôi đã thiết lập với Apache + mod_wsgi đang chạy mã django và tôi muốn thêm một lớp bảo vệ trong trường hợp chế độ xem không chấm dứt bị trượt. -trên một yêu cầu vượt quá, nói rằng, 30 giây sẽ là lý tưởng.Tự động chấm dứt các yêu cầu chạy dài ở Django

Để thử nghiệm, tôi chỉ cần đặt time.sleep(60) trong chế độ xem.

Tôi đã thử cài đặt TimeOut 30 trong Apache, nhưng tôi vẫn nhận được curl quay lại sau 60 giây.

Tôi thấy chính mod_wsgi cung cấp ba giá trị hết giờ khác nhau, nhưng không có giá trị nào trong số chúng dường như áp dụng cho một yêu cầu dài hạn.

Có một phần chuẩn của phần mềm trung gian Django cho điều này hay không có núm tôi đang thiếu trên Apache hoặc mod_wsgi?

Trả lời

6

Thực sự rất khó để chấm dứt một chuỗi yêu cầu Python trong một ứng dụng đa luồng. Điều tốt nhất bạn có thể làm là đưa ra quyết định tắt toàn bộ quá trình và khởi động lại nó. Vì một hành động như vậy sẽ làm gián đoạn các yêu cầu đồng thời, nên bạn thực sự cần phải hạn chế bản thân đối với một cấu hình luồng đơn.

Thậm chí sau đó hỗ trợ trong mod_wsgi 3.X không lý tưởng cho việc này. Không có thời gian chờ không hoạt động cho chế độ daemon, nhưng nó thực sự khiến quá trình được khởi động lại trong hai tình huống. Đầu tiên là khi không có yêu cầu nào cả và quá trình không hoạt động. Thứ hai là khi tất cả các chuỗi yêu cầu đã bị chặn và hết thời gian chờ.

Trong mod_wsgi 4.X (trong kho lưu trữ tại thời điểm này), hai khái niệm đã được tách ra và giờ không hoạt động - thời gian chờ chỉ áp dụng cho quá trình hoàn toàn nhàn rỗi không có yêu cầu đồng thời. Một thời gian chờ bị chặn mới đã được thêm vào một thời gian chờ riêng biệt cụ thể khi toàn bộ quá trình bị chặn. Đây là cái thứ hai bạn có thể sử dụng.

Nếu bạn muốn tìm hiểu thêm về tùy chọn mới, bạn sẽ cần phải chuyển sang danh sách gửi thư mod_wsgi để thảo luận.

+0

Cảm ơn. Một điều chúng tôi đã cố gắng làm là chuyển đổi từ, nói 5 quy trình với hai mươi chuỗi yêu cầu mỗi, với 100 quy trình với mỗi chuỗi yêu cầu. Hy vọng là thời gian chờ của mod_wsgi sau đó có thể giết chết các quá trình với các yêu cầu không liên quan. Trong thực tế mà không làm việc ra cho lý do bộ nhớ hệ thống (tôi đã mong đợi nhiều bộ nhớ chia sẻ), nhưng là nó có thể mod_wsgi có thể giết chết quá trình đó nếu thời gian chờ không hoạt động gây nên? –

+0

Ứng dụng được tải sau ngã ba, vì vậy không có gì được chia sẻ sao cho bản sao viết sẽ là một lợi ích. Lợi ích của việc tải trước trước khi forking trong Python không nhiều như mọi người sẽ nghĩ khi thực thi mã thao túng số lượng tham chiếu và do đó sao chép được thực hiện trên hầu hết mọi thứ theo bất kỳ cách nào. –

+0

Tùy chọn thời gian chờ bị khóa trong mod_wsgi 4.0 vẫn có thể là đặt cược tốt nhất của bạn. Bạn vẫn có thể chạy multithreaded và nó sẽ kick trong khi tất cả các chủ đề đã bị mắc kẹt. Chờ đợi cho đến khi tất cả các chủ đề bị mắc kẹt mặc dù cũng không tốt. Vì vậy, đó cũng là một thiết lập yêu cầu bị chặn. Nếu bạn có chủ đề = 15, bạn có thể nói các yêu cầu bị chặn = 5. Vì vậy, ngay sau đó nó được năm chủ đề bị mắc kẹt và số điểm truy cập mà không có yêu cầu được xử lý bởi quá trình, hoặc, sau đó nó sẽ làm một cách an toàn khởi động lại. Việc có thể đặt ngưỡng yêu cầu bị chặn cung cấp cho bạn một mức độ an toàn để quá trình không bị bẻ cong. –

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