2013-02-11 31 views
118

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. Tuy nhiên, 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.Tôi có thể phục vụ nhiều khách hàng chỉ bằng cách sử dụng Flask app.run() dưới dạng độc lập không?

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

Trả lời

182

flask.Flask.run chấp nhận lập luận thêm từ khóa (**options) mà nó chuyển tiếp đến werkzeug.serving.run_simple - hai trong số những đối số là threaded (mà bạn có thể thiết lập để True để cho phép luồng) và processes (mà bạn có thể thiết lập để một số lớn hơn một người có werkzeug đẻ trứng nhiều hơn một quá trình để xử lý yêu cầu). Vì vậy, nếu bạn làm như vậy:

if __name__ == '__main__': 
    app.run(threaded=True) 
    # Alternately 
    # app.run(processes=3) 

Bình sẽ cho Werkzeug sử dụng luồng và đẻ trứng ba quy trình để xử lý các yêu cầu đến.

Điều đó đang được nói, Wunkzeug's serving.run_simple kết thúc gói thư viện chuẩn wsgiref của thư viện chuẩn - và gói đó chứa thực thi tham chiếu WSGI, không phải máy chủ web sẵn sàng cho 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à một ứng dụng nội bộ lưu lượng thấp với không quá 10 người dùng đồng thời), hãy đảm bảo đứng đằng sau một máy chủ web thực (xem phần tài liệu của Flask) Deployment Options đối với một số phương pháp được đề xuất).

+1

Điều gì xảy ra nếu tôi đang xem tối đa 100 người dùng? Tôi có thể chỉ định 'quy trình = 100' và vui vẻ với nó không? 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 chủ đề Flask như là một phần của ứng dụng mẹ, để tất cả chúng có thể chia sẻ các biến. – ATOzTOA

+1

* Chuckles * - @ATOzTOA - không, điều đó có thể là * khá * phản tác dụng (Quy trình tương đối đắt tiền, và trừ khi bạn đang làm rất nhiều công việc trong mỗi yêu cầu không có lý do tại sao 4 hoặc 8 quy trình không nên đủ). Đ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 để làm điều đó (Apache, ngnix, IIS). –

+1

Ngoài ra, bạn không nên thường xuyên chia sẻ các biến trên các yêu cầu - nếu bạn * làm * bạn sẽ cần phải giới hạn bản thân cho một quy trình hoặc sử dụng một số giao tiếp ngoài băng tần (Redis, cơ sở dữ liệu, hệ thống tệp, v.v. .) để mỗi quy trình của bạn được đồng bộ hóa. –

32

Sử dụng đơn giản app.run() từ bên trong Flask tạo một máy chủ đồng bộ duy nhất trên một chuỗi có khả năng chỉ phục vụ một khách hàng một lúc. 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.

Tạo chủ đề và tự quản lý chúng có thể sẽ không giúp bạn đạt được rất nhiều, bởi vì the Python GIL.

Điều đó nói rằng, bạn vẫn có một số tùy 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, vì vậy không lo lắng về GIL) và thậm chí đi kèm với asynchronous workers. không làm việc một phần của bạn (đặc biệt là với Flask).

Tuy nhiên, thậm chí Gunicorn có lẽ không nên được hiển thị công khai trực tiếp. Trong sản xuất, nó nên được sử dụng phía sau một máy chủ HTTP mạnh mẽ hơn; nginx có xu hướng hoạt động tốt với Gunicorn và Flask.

+0

Gunicorn và nginx hoàn toàn là python, phải không? Vì vậy, tôi có thể sinh ra mỗi trong số này như là một chủ đề riêng biệt từ ứng dụng python của tôi? – ATOzTOA

+8

không hoàn toàn. Gunicorn là python, 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 mình dưới dạng ứng dụng 'gunicorn: ứng dụng 127.0.0.1: 8080' thay vì' python app.py'. Nginx sẽ hoạt động như một dịch vụ công khai cho thấy ứng dụng Gunicorn chạy riêng của bạn [(proxy ngược)] (http://en.wikipedia.org/wiki/Reverse_proxy), ẩn tất cả các chi tiết thực hiện HTTP cấp thấp hơn, có lẽ phân phát tệp tĩnh trực tiếp, v.v. –

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