2011-11-01 38 views
12

Trước khi đăng bài này, tôi đã đọc khá một vài tài nguyên trực tuyến, bao gồm cả wiki mod_wsgi, nhưng tôi nhầm lẫn về cách chính xác các quy trình/luồng của Apache tương tác với mod_wsgi. Đây là sự hiểu biết hiện tại của tôi: Apache có thể được cấu hình để chạy sao cho một hoặc nhiều tiến trình con có thể xử lý các yêu cầu đến và mỗi quy trình con này có thể được cấu hình để sử dụng một hoặc nhiều luồng cho yêu cầu dịch vụ. Sau đó, mọi thứ bắt đầu trở nên mơ hồ đối với tôi. Những nghi ngờ của tôi là:Tương tác Apache + mod_wsgi

  1. WSGIDaemonProcess là gì và ai thực sự gọi ứng dụng Django của tôi bằng trình thông dịch phụ python?
  2. Nếu tôi có ứng dụng Django của mình đang chạy trong chế độ có nhiều luồng được phép trong một tiến trình con Apache duy nhất - điều đó có nghĩa là nhiều yêu cầu có thể đồng thời truy cập vào ứng dụng của tôi cùng một lúc không? Nếu vậy - sẽ làm một cái gì đó như thiết lập một biến cấp mô-đun (nói rằng của một ID của người dùng) có thể được ghi đè bởi các yêu cầu song song khác và dẫn đến hành vi an toàn không thread?
  3. Đối với trường hợp trên, với khóa thông dịch toàn cục của Python, các luồng có thực sự được thực thi song song không?

Trả lời

10

Trả lời cho từng điểm.

1 - WSGIDaemonProcess/WSGIProcessGroup chỉ ra rằng mod_wsgi nên là nhánh của một quá trình riêng biệt để chạy ứng dụng WSGI. Đây là một ngã ba chứ không phải là một ngã ba/exec, vì vậy mod_wsgi vẫn nằm trong tầm kiểm soát của nó. Khi nó được phát hiện rằng một URL ánh xạ tới một ứng dụng WSGI đang chạy trong chế độ daemon, thì mã mod_wsgi trong các tiến trình công nhân con Apache sẽ ủy nhiệm các chi tiết yêu cầu thông qua quá trình chế độ daemon nơi mã mod_wsgi có đọc nó và gọi vào WSGI của bạn ứng dụng.

2 - Có, nhiều yêu cầu có thể hoạt động đồng thời và muốn sửa đổi dữ liệu chung của mô-đun cùng một lúc.

3 - Đối với thời gian thực hiện trong chính Python thì không, chúng không chạy song song khi khóa thông dịch toàn cầu có nghĩa là chỉ có một luồng có thể thực thi mã Python tại một thời điểm. Trình thông dịch Python sẽ định kỳ chuyển đổi luồng nào đang chạy. Nếu một trong các chủ đề gọi vào mã C và giải phóng GIL thì ít nhất là đối với thời gian mà luồng đó ở trạng thái đó nó có thể chạy song song với các luồng khác, chạy trong mã Python hoặc C. Ví dụ, khi các cuộc gọi được thực hiện vào lớp Apache/mod_wsgi để ghi dữ liệu trả lời, thì GIL sẽ được giải phóng. Điều này có nghĩa rằng việc ghi lại dữ liệu phản hồi thực tế ở các tầng thấp hơn không ngăn cản các luồng khác chạy.

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