1. 程式人生 > >flask如何處理並發

flask如何處理並發

.html gevent htm ted gun processes his div note

1、使用自身服務器的多進程或者多線程,參考werkzeug的run_simple函數的入參。註意,進程和線程不能同時開啟

2、使用gunicorn使用多進程,-w worker 進程數,類型於運行多個app.run()開發服務器

gunicorn app -w 2 -b :8000

3、使用gevent異步

/usr/local/bin/gunicorn -t120 -w10 -b 10.57.17.57:3000 --worker-class gevent Erebus:APP

-k STRING, --worker-class STRING
The type of workers to use. [sync]

-w INT, --workers INT
The number of worker processes for handling requests.
[1]

-t INT, --timeout INT
Workers silent for more than this many seconds are
killed and restarted. [30]

-b ADDRESS, --bind ADDRESS
The socket to bind. [[‘127.0.0.1:8000‘]]

當運行開發服務器時,運行app.run(),你會得到一個單一的同步進程,這意味著一次最多只能處理1個請求。

通過在其默認配置中堅持Gunicorn在它的前面,只是增加 – 工作,你獲得的本質上是一些進程(由Gunicorn管理),每個行為像app.run()開發服務器。 4個worker == 4個並發請求。這是因為Gunicorn默認使用它包含的同步工作類型。

重要的是要註意,Gunicorn還包括異步工作,即eventlet和gevent(和龍卷風,但是最好使用Tornado框架,似乎)。通過使用–worker-class標誌指定其中一個異步工作者,您所獲得的是Gunicorn管理多個異步進程,每個進程管理自己的並發。這些進程不使用線程,而是協同程序。基本上,在每個進程內,每次只能發生一件事情(1個線程),但是當對象在等待外部進程完成時(可以考慮數據庫查詢或等待網絡I / O),它們可以被“暫停”。

這意味著,如果你使用Gunicorn的異步工作者,每個工作者可以一次處理多個請求。只有多少工人是最好的取決於你的應用程序的性質,它的環境,它運行的硬件等等。更多的細節可以在Gunicorn’s design頁和notes on how gevent works在其介紹頁上找到。

flask如何處理並發