Tôi có thể phục vụ nhiều khách hàng bằng cách sử dụng Flask app.run () dưới dạng độc lập không?


201

Tôi biết tôi có thể liên kết Flask với Apache hoặc các máy chủ web khác. Nhưng, tôi đã nghĩ đến việc chạy Flask như một máy chủ độc lập phục vụ nhiều khách hàng cùng một lúc.

Điều này có thể không? Tôi có phải xử lý sinh sản nhiều luồng và quản lý chúng không?

Câu trả lời:


295

flask.Flask.runchấ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).

threadedmặc định Truelà 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_simplebao 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).


2
Nếu tôi đang xem tối đa 100 người dùng thì sao? Tôi có thể chỉ định processes=100và 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.
ATOzTOA

4
Chuckles - @ATOzTOA - không, điều đó có thể sẽ khá phản tác dụng (Các quy trình tương đối tốn kém, và trừ khi bạn đang thực hiện nhiều công việc trong mỗi yêu cầu, không có lý do nào khiến 4 hoặc 8 quy trình không đủ). Điều đó nói rằng, nếu bạn chỉ hiển thị nội dung tĩnh, bạn sẽ tốt hơn với một máy chủ được tối ưu hóa để thực hiện điều đó (Apache, ngnix, IIS).
Sean Vieira

2
Ngoài ra, bạn không nên thường cần phải biến phần trên yêu cầu - nếu bạn làm bạn có sẽ cần phải giới hạn mình với một quy trình hay sử dụng một số thông tin liên lạc out-of-band (Redis, một cơ sở dữ liệu, hệ thống tập tin, vv) để rằng mỗi quy trình của bạn vẫn được đồng bộ hóa.
Sean Vieira

3
@ATOzTOA - nếu bạn không thể tạo ra một máy chủ tốt hơn thì tôi chỉ cần cho nó một vòng xoáy và xem điều gì sẽ xảy ra. Nếu nó không hoạt động tốt khi tải, bạn có thể triển khai nó phía sau một máy chủ web khác.
Sean Vieira

2
@ATOzTOA, liên quan đến câu hỏi của bạn về lý do tại sao bạn không thể chỉ định 'luồng' và 'quy trình' cùng một lúc, hãy cf mã ở đây: werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

62

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.


17
không hẳn. Gunicorn là trăn, nginx thì không. đó không phải là cách bạn sẽ sử dụng chúng, mặc dù. Gunicorn sẽ cho phép bạn chạy ứng dụng của bạn gunicorn app:app 127.0.0.1:8080thay 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.
Ryan Artecona

Flask với app.run (threaded = True) chạy rất tốt trên Apache2 bằng cách sử dụng mod_wsgi Vase.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.