2012-06-07 97 views
70

我正在用Flask構建一個應用程序,但我對WSGI不太瞭解,它是HTTP基礎,Werkzeug。當我開始爲gunskorn和4個工作進程提供Flask應用程序時,這是否意味着我可以處理4個併發請求?單個Flask進程接收多少個併發請求?

我的意思是併發請求,而不是每秒請求或其他任何請求。

謝謝!

回答

104

運行開發服務器時,您運行app.run(),您將得到一個同步進程,這意味着一次最多處理1個請求。

在其默認的配置在它的面前堅持Gunicorn,只是增加--workers數量,你會得到什麼本質上是一個數量的進程(通過Gunicorn管理),每個行爲類似於app.run()開發服務器。 4名工作人員== 4個併發請求。這是因爲Gunicorn默認使用其包含的sync工人類型。

重要的是要指出,Gunicorn還包括異步工作者,即eventletgevent(也是tornado,但它似乎最好與Tornado框架一起使用)。通過使用--worker-class標誌指定這些異步工作人員之一,您將得到的是Gunicorn管理多個異步進程,,其中每個管理自己的併發。這些進程不使用線程,而是使用協程。基本上,在每個進程中,一次只能發生一件事(1個線程),但當等待外部進程完成時(考慮數據庫查詢或等待網絡I/O),對象可能會「暫停」。

這意味着,如果您使用的是Gunicorn的異步工作人員,則每個工作人員一次只能處理多個請求。究竟有多少人是最好的,取決於你的應用程序的性質,環境,運行的硬件等。更多詳細信息可在Gunicorn's design頁面和notes on how gevent works的介紹頁面找到。

+2

Gunicorn現在支持自19版以來的「真實」線程。請參閱[this](http://docs.gunicorn.com)。 org/en/stable/design.html#how-many-threads)和[this](http://docs.gunicorn.org/en/stable/settings.html#threads)。 –

7

不,你絕對可以處理更多。

重要的是要記得深入深入,假設您運行的是單核機器,CPU一次只能運行一條指令*。

也就是說,CPU只能執行非常有限的一組指令,並且它不能在每個時鐘週期執行多條指令(許多指令甚至需要多於一個刻度)。

因此,我們在計算機科學中談論的大多數併發性是軟件併發性。 換句話說,有一些軟件實現層將我們的底層CPU抽象出來,並讓我們認爲我們正在同時運行代碼。

這些「事物」可以是進程,它們是併發運行的代碼單元,每個進程都認爲它使用自己的非共享內存運行在自己的世界中。

另一個例子是線程,線程是允許併發的進程內部的代碼單元。

你的4個工作進程將能夠處理多於4個請求的原因是他們將觸發線程來處理越來越多的請求。

實際要求限制取決於選擇的HTTP服務器上,I/O,操作系統,硬件,網絡連接等

祝你好運!

*指令是CPU可以運行的基本命令。示例 - 添加兩個數字,從一條指令跳轉到另一條指令

+1

是gunicorn產卵線程還是Flask?我發現沒有證據支持這兩種可能性。 –

+2

gunicorn衍生進程 – Carson

+0

當然,我瞭解有關進程,但答案表示更多的線程是根據需要產生的。這是我想要確認的。 –

18

Flask將同時處理每個線程的一個請求。如果你有2個進程,每個進程有4個線程,那就是8個併發請求。

燒瓶不生成或管理線程或進程。這是WSGI網關(例如gunicorn)的責任。