Câu trả lời:
flask.Flask.run
chấp nhận các đối số từ khóa bổ sung ( **options
) mà nó chuyển tiếp tới werkzeug.serving.run_simple
- hai trong số các đối số đó là threaded
(boolean) và processes
(mà bạn có thể đặt thành một số lớn hơn một để có werkzeug sinh ra nhiều hơn một quy trình để xử lý các yêu cầu).
threaded
mặc định True
là Flask 1.0, vì vậy đối với các phiên bản mới nhất của Flask, máy chủ phát triển mặc định sẽ có thể phục vụ nhiều máy khách cùng một lúc theo mặc định. Đối với các phiên bản cũ hơn của Flask, bạn có thể vượt qua một cách rõ ràng threaded=True
để kích hoạt hành vi này.
Ví dụ, bạn có thể làm
if __name__ == '__main__':
app.run(threaded=True)
để xử lý nhiều máy khách bằng cách sử dụng các luồng theo cách tương thích với các phiên bản Flask cũ hoặc
if __name__ == '__main__':
app.run(threaded=False, processes=3)
để bảo Werkzeug sinh ra ba quy trình để xử lý các yêu cầu đến hoặc chỉ
if __name__ == '__main__':
app.run()
để xử lý nhiều ứng dụng khách sử dụng các luồng nếu bạn biết rằng bạn sẽ sử dụng Flask 1.0 trở lên.
Điều đó đang được nói, Werkzeug serving.run_simple
bao bọc gói thư viện tiêu chuẩn wsgiref
- và gói đó chứa một triển khai tham chiếu của WSGI, không phải là một máy chủ web sẵn sàng sản xuất. Nếu bạn định sử dụng Flask trong sản xuất (giả sử rằng "sản xuất" không phải là ứng dụng nội bộ có lưu lượng truy cập thấp với không quá 10 người dùng đồng thời), hãy đảm bảo đứng sau máy chủ web thực (xem phần tài liệu của Flask có tên Tùy chọn triển khai cho một số phương pháp được đề xuất).
Sử dụng đơn giản app.run()
từ bên trong Flask tạo ra một máy chủ đồng bộ duy nhất trên một luồng duy nhất có khả năng chỉ phục vụ một khách hàng tại một thời điểm. Nó được thiết kế để sử dụng trong các môi trường được kiểm soát với nhu cầu thấp (tức là phát triển, gỡ lỗi) vì lý do chính xác này.
Sinh ra các chủ đề và tự quản lý chúng có lẽ sẽ không giúp bạn tiến xa, vì GIL Python .
Điều đó nói rằng, bạn vẫn có một số lựa chọn tốt. Gunicorn là một máy chủ WSGI vững chắc, dễ sử dụng, cho phép bạn sinh ra nhiều công nhân (các quy trình riêng biệt, do đó không phải lo lắng về GIL) và thậm chí đi kèm với các công nhân không đồng bộ sẽ tăng tốc ứng dụng của bạn (và làm cho nó an toàn hơn) không làm việc về phía bạn (đặc biệt là với Flask).
Tuy nhiên, ngay cả Gunicorn có lẽ không nên được công khai trực tiếp. Trong sản xuất, nó nên được sử dụng đằng sau một máy chủ HTTP mạnh hơn; nginx có xu hướng phù hợp với Gunicorn và Flask.
gunicorn app:app 127.0.0.1:8080
thay vì python app.py
. Nginx sẽ đóng vai trò là dịch vụ công khai hiển thị ứng dụng chạy Gunicorn riêng của bạn (proxy ngược) , ẩn tất cả các loại chi tiết triển khai HTTP cấp thấp hơn, có thể phục vụ trực tiếp các tệp tĩnh, v.v.
processes=100
và hạnh phúc với nó? Trong trường hợp của tôi, tôi chỉ cần các tệp tĩnh, không có phương thức HTTP Post. Yêu cầu của tôi là, tôi muốn chạy tất cả các luồng Flask như một phần của ứng dụng mẹ, để tất cả chúng có thể chia sẻ các biến.