2016-07-17 15 views
13

Về Gunicorn, tôi biết có nhiều lớp nhân viên khác nhau nhưng đối với cuộc hội thoại này, tôi chỉ xem xét các loại đồng bộ và không đồng bộ.Công nhân và chủ đề Gunicorn

Từ hiểu biết của tôi ...

sync 
workers = (2 * cpu) + 1 
worker_class = sync 

async (gevent) 
workers = 1 
worker_class = gevent 
worker_connections = a value (lets say 2000) 

Vì vậy, (dựa trên một hệ thống 4 core) sử dụng lao động đồng bộ hóa tôi có thể có tối đa xử lý 9 kết nối song song. Với Async tôi có thể có đến năm 2000, với những lời khuyên đi kèm với async.

Câu hỏi

  • Vì vậy, nơi nào chủ đề phù hợp? Tôi có thể thêm chủ đề cho cả hai loại công việc đồng bộ và không đồng bộ không?
  • Lựa chọn tốt nhất cho công nhân gunicorn là gì? Tôi có nên đặt gunicorn trước API Django không, với yêu cầu xử lý 100 yêu cầu song song?
  • Chuỗi chủ đề của nhân viên gevent và đồng bộ hóa có an toàn không?

Trả lời

26

Hãy để tôi thử câu trả lời. Chúng ta hãy giả định rằng ngay từ đầu triển khai của tôi chỉ có một nhân viên gunicorn duy nhất. Điều này cho phép tôi xử lý chỉ một yêu cầu tại một thời điểm. Công việc của công nhân của tôi chỉ là thực hiện cuộc gọi đến google.com và nhận kết quả tìm kiếm cho một truy vấn. Bây giờ tôi muốn tăng thông lượng của mình. Tôi có các tùy chọn bên dưới

Chỉ giữ lại một nhân viên và tăng số lượng đề ở chỗ công nhân

Đây là đơn giản nhất. Vì các luồng có trọng lượng nhẹ hơn (tiêu thụ bộ nhớ ít hơn) so với các quy trình, tôi chỉ giữ một công nhân và thêm một số luồng vào đó. Gunicorn sẽ đảm bảo rằng chủ nhân có thể gửi nhiều hơn một yêu cầu tới nhân viên. Vì nhân viên đa luồng, nó có thể xử lý 4 yêu cầu. Tuyệt diệu. Bây giờ tại sao tôi cần nhiều công nhân hơn?

Để trả lời điều đó, giả sử rằng tôi cần thực hiện một số công việc trên kết quả tìm kiếm mà google đã trả lại. Ví dụ: tôi cũng có thể muốn tính số nguyên tố cho mỗi truy vấn kết quả. Bây giờ tôi đang làm cho tính toán tải công việc của tôi bị ràng buộc và tôi nhấn vấn đề với khóa thông dịch toàn cầu của python. Mặc dù tôi có 4 luồng, chỉ một luồng có thể thực sự xử lý kết quả tại một thời điểm. Điều này có nghĩa là để có được hiệu suất song song thực sự, tôi cần nhiều hơn một công nhân.

Tăng Số công nhân nhưng tất cả công nhân độc thân ren

Vậy tại sao tôi cần điều này sẽ là khi tôi cần để có được xử lý song song đúng. Mỗi công nhân có thể thực hiện cuộc gọi đến google.com, nhận kết quả và thực hiện bất kỳ quá trình xử lý nào. Tất cả đều song song. Tuyệt diệu. Nhưng nhược điểm là các quy trình nặng hơn và hệ thống của tôi có thể không theo kịp các yêu cầu của công nhân ngày càng tăng để thực hiện song song. Vì vậy, giải pháp tốt nhất là tăng công nhân và cũng thêm nhiều chủ đề hơn cho mỗi công nhân.

Tăng số lượng công nhân và mỗi công nhân được đa luồng

Tôi đoán điều này không cần giải thích thêm.

Thay đổi loại công nhân thành Async

Bây giờ tại sao tôi lại muốn làm điều này? Để trả lời, hãy nhớ rằng ngay cả chủ đề tiêu thụ bộ nhớ.Có coroutines (một cấu trúc cấp tiến mà bạn có thể tra cứu) được thực hiện bởi thư viện gevent cho phép bạn nhận các luồng mà không cần tạo các luồng. SO nếu bạn chế tác chiếc xe kéo của mình để sử dụng loại công nhân của gevent, bạn sẽ nhận được lợi ích của việc KHÔNG phải tạo ra các chủ đề trong công nhân của bạn. Giả sử rằng bạn đang nhận được chủ đề w/o phải rõ ràng tạo ra chúng.

Vì vậy, để trả lời câu hỏi của bạn, nếu bạn đang sử dụng worker_type của bất cứ điều gì khác ngoài Sync, bạn không cần phải tăng số lượng các chủ đề trong cấu hình gunicorn của bạn. Bạn có thể làm điều đó, bằng mọi cách, nhưng nó đánh bại mục đích.

Hy vọng điều này sẽ hữu ích.

Tôi cũng sẽ cố gắng trả lời các câu hỏi cụ thể.

  • Không, tùy chọn chuỗi không có trong lớp nhân viên Async. Điều này thực sự cần được làm rõ hơn thông qua tài liệu. Tự hỏi tại sao điều đó không xảy ra.

  • Đây là câu hỏi cần thêm kiến ​​thức về ứng dụng cụ thể của bạn. Nếu việc xử lý 100 yêu cầu song song chỉ liên quan đến hoạt động I/O, như tìm nạp từ DB, lưu, thu thập dữ liệu từ một số ứng dụng khác, thì bạn có thể sử dụng nhân viên được chỉ định. Nhưng nếu đó không phải là trường hợp và bạn muốn thực hiện trên một CPU n lõi vì các nhiệm vụ cực kỳ tính toán bị ràng buộc, có thể giống như tính toán số nguyên tố, bạn cần sử dụng công nhân đồng bộ . Lý do cho Async hơi khác một chút. Để sử dụng Không đồng bộ, bạn cần phải chắc chắn rằng quá trình xử lý của bạn không bị ràng buộc tính toán, điều này có nghĩa là bạn sẽ không thể sử dụng nhiều lõi. Lợi thế bạn nhận được là bộ nhớ mà nhiều chủ đề sẽ mất sẽ không có ở đó. Nhưng bạn có các vấn đề khác như thư viện không phải khỉ. Chỉ chuyển sang Async nếu nhân viên được chỉ định không đáp ứng được các yêu cầu của bạn là .

  • Công nhân đồng bộ hóa, không có luồng là lựa chọn tốt nhất nếu bạn muốn an toàn tuyệt đối trong số các thư viện của mình một cách an toàn .

+0

Nhưng do GIL tại sao không phải lúc nào cũng chạy async ngay cả khi tính toán bị ràng buộc. Chủ đề an toàn đã được bảo lãnh. – garg10may

+2

Đặt bản thân mình vào đôi giày của một người có thể quyết định làm điều này, tôi sẽ sợ những mô-đun nào có thể không được khỉ vá đúng cách để làm việc có thể dự đoán được khi lớp nhân viên Async được sử dụng. Async cho tất cả các lợi ích của nó đi kèm với những rủi ro riêng của mình. Bạn phải chắc chắn rằng tất cả các mã của bạn là khỉ vá và không có mã nguồn gốc chạy. Vì vậy, rủi ro đó sẽ ngăn tôi đi Async luôn. – abhayAndPoorvisDad

+0

câu trả lời hay. nó vẫn chưa rõ điều này với tôi, tại sao/như thế nào thư viện nên được khỉ vá và nếu có một số cách để kiểm tra xem họ có? – Paolo

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