2010-02-10 34 views
6

Trong khi phát triển một ứng dụng Django được triển khai trên Apache mod_wsgi tôi thấy rằng trong trường hợp đa luồng (chủ đề Python; mod_wsgi processes = 1 threads = 8) Python sẽ không sử dụng tất cả các bộ xử lý có sẵn. Với phương pháp tiếp cận đa xử lý (mod_wsgi processes = 8 threads = 1) tất cả đều tốt và tôi có thể tải toàn bộ máy của mình.Liệu Python có sử dụng tất cả các bộ xử lý trong chế độ luồng không?

Vì vậy, câu hỏi: hành vi Python này có bình thường không? Tôi nghi ngờ nó bởi vì sử dụng 1 quá trình với vài chủ đề là cách tiếp cận mod_wsgi mặc định. hệ thống

là:

2xIntel Xeon 5xxx series (8 lõi (16 với hyperthreading)) trên FreeBSD 7.2 AMD64 và Python 2.6.4


Cảm ơn tất cả các câu trả lời. Chúng ta đều thấy rằng hành vi này là bình thường vì GIL. Đây là một lời giải thích tốt: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ hoặc stackoverflow GIL thảo luận: .

+1

tại sao câu hỏi này có ba lần bỏ phiếu? một tìm kiếm google đơn giản sẽ có đủ. – aaronasterling

+0

@aaronasterling: Chúng tôi muốn tạo stackoverflow một cơ sở dữ liệu kiến ​​thức lớn với các câu hỏi đơn giản và câu trả lời đơn giản. Chắc chắn thông tin này có sẵn nếu bạn STFG – HardQuestions

Trả lời

10

Python có sử dụng tất cả các bộ xử lý trong chế độ chuỗi không? Số

Python sẽ không sử dụng tất cả các bộ xử lý có sẵn; hành vi Python này có bình thường không? Vâng, nó là bình thường vì GIL.

Để thảo luận, xem http://mail.python.org/pipermail/python-3000/2007-May/007414.html.

Bạn có thể thấy rằng có một vài (hoặc 4) luồng trên mỗi lõi/quá trình vẫn có thể cải thiện hiệu suất nếu có một số ngăn chặn, ví dụ chờ phản hồi từ cơ sở dữ liệu sẽ làm cho quá trình đó chặn các kết nối khác.

+0

đề xuất cuối cùng bạn đã thực hiện không thể cải thiện hiệu suất theo cách tiếp cận duy nhất không chặn duy nhất – nosklo

1

Tôi không biết nếu nó vẫn là trường hợp, nhưng có một khóa toàn cầu trong trình thông dịch Python, ngăn cản việc sử dụng tất cả tài nguyên bộ vi xử lý từ một trình thông dịch đơn, ngay cả khi sử dụng đa luồng. IIRC, khóa toàn cầu phải làm với I/O.

Có vẻ như bạn đang xem kết quả của khóa này, vì vậy, cá nhân, tôi sẽ sử dụng nhiều quy trình với một chuỗi duy nhất.

4
  1. Liệu python có sử dụng tất cả bộ xử lý trong chế độ chuỗi không? Số

  2. Điều này bình thường? Vâng, điều này là bình thường. Python không cố gắng tìm tất cả các lõi của bạn.

  3. Quy trình "1 có vài luồng là phương pháp mặc định mod_wsgi". Nhưng đó không phải là tối ưu hoặc thậm chí là mong muốn. Đó chỉ là một mặc định. Đừng đọc bất cứ điều gì vào nó.

Nếu bạn muốn sử dụng tất cả tài nguyên của máy tính, hãy làm cho hệ điều hành xử lý. Sử dụng quy trình.

Sự khác biệt giữa đa xử lý và đa luồng khó có thể đo lường cho hầu hết các phần. Sử dụng quy trình hoặc chủ đề hầu như không quan trọng. Nó thường đơn giản hơn để sử dụng các quy trình, vì có hỗ trợ hệ điều hành nhỏ cho việc này.

Bottom Line

Sử dụng nhiều quy trình, cho phép hệ điều hành (và Apache) để làm cho càng nhiều càng tốt sử dụng của hệ thống.

Chủ đề chia sẻ một bộ tài nguyên I/O có giới hạn cho Quy trình mà họ tham gia và việc phân phát trang web là I/O bị ràng buộc. Các quy trình có các tài nguyên I/O độc lập và sẽ dễ dàng xử lý tối đa bộ xử lý của bạn.

+0

cũng xem: http://docs.python.org/library/multiprocessing.html – exhuma

1

Có. Python không thực sự đa luồng. Thay vào đó, có một khóa toàn cầu và mỗi thread được thực hiện một vài hoạt động lần lượt. Điều này làm cho nó đơn giản hơn nhiều khi viết các ứng dụng MT bằng Python vì không thể có bất kỳ vấn đề nào với cache cũ, vv

Vì vậy, một quá trình Python chỉ có thể chiếm một CPU đơn. Để sử dụng đầy đủ hệ thống đa lõi, bạn phải chạy một số quy trình Python.

3

Vẫn còn hy vọng. GIL chỉ là một tạo phẩm triển khai thực hiện C Python mà bạn tải xuống từ python.org. Jython và IronPython là hai triển khai khác của Python, và chúng không có GIL, vì vậy bạn có thể có kết quả luồng tốt hơn với một trong số chúng.

+1

Đúng, nhưng OP không thể sử dụng Jython hoặc IronPython với mod_wsgi. –

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