gunicorn --workers=9 main:app
2. Các luồng (threads)
Ngoài việc cho phép tạo ra nhiều worker, gunicorn còn cho phép một worker có thể tạo ra nhiều thread, các thread trong một worker chia sẻ cùng tài nguyên bộ nhớ với nhau.
Để sử dụng thread với gunicorn, chúng ta sử dụng tham số threads.
gunicorn --workers=9 --threads=4 main:app
Số lượng tác vụ cùng lúc tối đa là workers * threads = 36 trong trường hợp ví dụ của chúng ta.
Tuy nhiên số lượng tác vụ được gợi ý nên dùng cho trường hợp dùng lẫn cả workers và threads vẫn là (2*number_of_cpu)+1 = 9 (trong trường hợp máy có 4 CPU). Do vậy để có được tối đa 9 tác vụ chạy đồng thời, ta có thể sử dụng 3 worker và mỗi worker có 3 thread.
gunicorn --workers=3 --threads=3 main:app
3. Loại worker
Gunicorn hỗ trợ nhiều loại worker
gunicorn --worker-class=gevent --worker-connections=1000 --workers=9 main:app
worker-connections là cài đặt cụ thể cho worker loại gevent
Trong ví dụ trên, số lượng yêu cầu đồng thời tối đa là 9000 ( 9 worker * 1000 kết nối trên một worker)
a. Sync worker
Synchronous worker là loại worker mặc định của Gunicorn, nó thể hiện cho mô hình worker cơ bản. Với mô hình này, mỗi worker sẽ xử lý một và chỉ một yêu cầu tại một thời điểm.
Loại worker này thường được sử dụng với ứng dụng không có thời gian đọc ghi vào ổ đĩa dài, hoặc không có những yêu cầu với thời gian lớn (long request - loại yêu cầu như này sẽ làm cho các yêu cầu khác phải đợi cho tới khi yêu cầu hiện tại được hoàn thành, điều này có thể làm cho các yêu cầu thất bại do kết nối bị lỗi timeout),
b. Async worker
Asynchronous worker bao gồm hai loại: gevent và eventlet, hai loại này được phát triển dựa trên thư viện Greenlet. Thư viện này cung cấp các phương thức giúp các tác vụ được xử lý đồng thời, nó giải quyết vấn đề của sync worker, cái mà chỉ xử lý được một yêu cầu tại một thời điểm.
c. Tornado worker
Loại worker này được thiết kế để làm việc với python framework Tornado. Tornado framework là một thư viện mạng cung cấp giải pháp đọc ghi bất đồng bộ non-blocking. Nó xử lý tốt các yêu cầu với thời gian lớn (long request).
d. AsyncIO Worker
AsyncIO bao gồm hai loại gthread và gaiohttp.
gaiohttp sử dụng thư viện aiohttp. Thư viện này thực hiện việc nhập xuất bất đồng bộ trong môi trường mạng ở cả phía client lẫn server và đặc biệt nó hỗ trợ web socket rất tốt.
gthread giữ kết nối trong một nhóm thread và đợi cho đến khi có sự kiện, sự kiện đó sẽ được xử lý bởi một trong các thread ở trong nhóm.
Khi nào nên dùng worker, khi nào nên dùng thread
Trong trường hợp ở môi trường development, chúng ta chỉ khởi chạy một worker, điều này cho phép chúng ta có thể xử lý một yêu cầu duy nhất tại một thời điểm, để tăng được năng lực xử lý của ứng dụng, ta có thể nâng số lượng worker hoặc số thread lên.
So với các worker,các thread nhẹ hơn, chúng tiêu thụ ít bộ nhớ. Gunicorn sẽ đảm bảo việc tiến trình gốc có thể gửi nhiều yêu cầu tới worker hơn bằng cách sử dụng 1 worker và nhiều thread (giả sử là 4). Như vậy có phải lúc nào sử dụng thread cũng có lợi ích nhiều hơn khi sử dụng worker không?
Để trả lời câu hỏi trên, hãy cùng xem xét ví dụ sau;
Giả sử tôi cần làm vài việc với kết quả tìm kiếm được từ một search engine (elasticsearch hay google chẳng hạn). Cùng lúc đó tôi cũng muốn tính toán xem trong kết quả tìm kiếm có số nào là số nguyên tố hay không trong mỗi truy vấn, lúc này tôi gặp phải một vấn đề với Python GIL (Global Interpreter Lock), nói nôm na GIL là một kỹ thuật khóa (lock) của trình thông dịch (trình thông dịch sẽ tự làm việc này chứ không phải lập trình viên), nó chỉ cho phép một thread được thao tác với một tài nguyên tại một thời điểm, điều này giúp trình thông dịch Python kiểm soát được sự thay đổi của tài nguyên (tài nguyên ở đây có thể là một biến, một đối tượng ...), tránh trường hợp chương trình trả về một kết quả không mong muốn mà không biết tại sao. Nhưng nó cũng dẫn đến việc, tuy rằng tôi có 4 thread, nhưng thực chất chỉ có một thread thực sự xử lý kết quả tại một thời điểm, nếu tác vụ xử lý kết quả này tốn nhiều thời gian thì lúc này tôi cần một phương án khác để giúp các tác vụ thực sự được xử lý song song, đó là dùng nhiều các worker hơn.
Cùng nhau học tập, khám phá các kiến thức nền tảng về Lập trình web, mobile, database nhé.
Nền tảng kiến thức - Hành trang tới tương lai hân hạnh phục vụ Quý khách!
Khám phá, trải nghiệm ngay
Vui lòng đăng nhập để gởi bình luận!
Đăng nhậpChưa có bình luận nào!