flask多进程多线程配置
flask.Flask.run接受**options轉發給它的其他關鍵字參數()werkzeug.serving.run_simple-其中兩個參數是threaded(布爾值)和processes(您可以將其設置為大于1的數字以使werkzeug產生多個進程來處理請求)。
threaded默認True版本自Flask 1.0起,因此對于最新版本的Flask,默認情況下默認開發服務器將能夠同時為多個客戶端提供服務。對于較舊版本的Flask,您可以顯式傳遞threaded=True以啟用此行為。
例如,您可以
if name == ‘main’:
app.run(threaded=True)
以與舊Flask版本兼容的方式使用線程處理多個客戶端,或者
if name == ‘main’:
app.run(threaded=False, processes=3)
告訴Werkzeug生成三個進程來處理傳入的請求,或者只是
if name == ‘main’:
app.run()
如果您知道將使用Flask 1.0或更高版本,則可以使用線程來處理多個客戶端。
話雖如此,Werkzeug的serving.run_simple包裝了標準庫的wsgiref軟件包-該軟件包包含WSGI的參考實現,而不是可用于生產的Web服務器。如果您要在生產環境中使用Flask(假設“生產環境”不是低流量的內部應用程序,并發用戶不超過10個),請確保將其支撐在真實的Web服務器后面(請參閱Flask文檔標題為“ 一些建議方法的部署選項)。
0x02 Flask開啟自帶的多線程或多進程 開啟多線程:app.run(debug=debug, host='0.0.0.0', port=8082, threaded=True) 1 app.run(debug=debug, host='0.0.0.0', port=8082, threaded=True) 開啟多進程app.run(debug=debug, host='0.0.0.0', port=8082, processes=10) 1 app.run(debug=debug, host='0.0.0.0', port=8082, processes=10) 需要注意的是,多進程和多線程不可以同時開啟,且需要關閉debug。下面再來看下請求結果[Process 91295] [Thread 123145513381888] 2020-09-29 14:29:01 _internal.py _log[line:122] [Process 91295] [Thread 123145509175296] 2020-09-29 14:29:01 _internal.py _log[line:122] 1 2 [Process 91295] [Thread 123145513381888] 2020-09-29 14:29:01 _internal.py _log[line:122] [Process 91295] [Thread 123145509175296] 2020-09-29 14:29:01 _internal.py _log[line:122] 可以看到,已經可以并發處理了。關于多進程方式,processes參數是指定進程數量,當并發度大于請求數量的時候仍然會阻塞。0x03 使用gunicorn多進程啟動Flask 安裝gunicornpip install gunicorn 1 pip install gunicorn 安裝完成后可以使用下面的命令來啟動gunicorn 入口文件名:app 1 gunicorn 入口文件名:app 這里的app是Flask(__name__)返回值得接收變量gunicorn支持配置文件啟動,如下例子:# gunicorn.confbind = "0.0.0.0:5000" workers = 4 backlog = 2048 pidfile = "log/gunicorn.pid" accesslog = "log/access.log" errorlog = "log/debug.log" timeout = 600 debug=False capture_output = True# gunicorn.confbind = "0.0.0.0:5000" workers = 4 backlog = 2048 pidfile = "log/gunicorn.pid" accesslog = "log/access.log" errorlog = "log/debug.log" timeout = 600 debug=False capture_output = True 啟動命令gunicorn --config gunicorn.conf main:app 1 gunicorn --config gunicorn.conf main:app 前言: 使用flask做服務時,可以使用python run.py的方式運行,但是這樣不能用于生產環境,可能會出現連接無響應的情況。后來通過查找資料,發現flask服務處理多線程、高并發的一下方法,主要有一下幾個方面:1.通過設置app.run()的參數,來達到多線程的效果,具體參數:# 1.threaded : 多線程支持,默認為False,即不開啟多線程; app.run(threaded=True) # 2.processes:進程數量,默認為1. app.run(processes=True) ps:多進程或多線程只能選擇一個,不能同時開啟 2.使用genvent做協程,解決高并發:from genvent.wsgi import WSGIServer from genvent import monkeymonkey.patch_all() app = Flask(__name__) app.config.from_object(config) api = Api(app)db = DBInfo() # db_old = DBInfo_old() 然后通過這種方式包裝WSGIServer((address,port), app).serve_forever() 通過python code.py 的方法,來啟動服務3.通過Guicorn(with genvent)的形式來對app進行包裝,來啟動服務; 通過一下代碼,來啟動項目# 啟動命令 gunicorn -c gun.py thread_explore:app 其中gun.py是gunicorn的配置文件 thread_explore是服務的主程序 app是flask的app gun.py的具體內容:import os import gevent.monkey gevent.monkey.patch_all() import multiprocessing# 服務地址(adderes:port) bind = 127.0.0.1;5000 # 啟動進程數量 workers = multiprocessing.cpu_count() * 2 +1 worker_class = 'gevent' threads = 20 preload_app = True reload = True x_forwarded_for_header = 'X_FORWARDED-FOR' ps:這里啟動進程數量應該是根據CPU個數來確定的,最好是2 * CPU數 + 1 參考資料: https://www.jianshu.com/p/a90775e33b52 https://www.cnblogs.com/lesliexong/p/9396850.html對于一個網站而言,必須要有一定的承受并發的能力,request只是一個變量名,真正的實例對象是Request()。同一時刻會有多個請求,而每一個請求的請求信息極有可能是不同的。這就會造成我們實際發送過來的請求信息是不相同的。那么用一個變量request怎么代表不同用戶的請求信息呢?
由于單線程是順序執行的,只有處理完一個請求才能處理另一個請求,對于單線程來說,請求就像排隊一樣,請求進來之后,flask會實例化一個Request對象,然后用request來裝載我們的請求信息,這個時候我們只有一個實例化的Request,所以啊,用request變量名是可以拿到我們要的請求信息的,所以request變量名總是會指向當前的請求,request就不會出現混亂。
多線程的請求,(對象是保存狀態的地方)
但是我們并不知道到底有多少個請求會發生,那么有沒有一種用一個變量來表示的所有的請求信息呢,有,字典
image.png
線程里有什么可以唯一確定一個線程呢,那就是線程的id號,可以作為key,在flask中就是采用的這種原理來解決的,這種用不同id號作為鍵,其實就是線程隔離,線程隔離只是一種思想,并不一定都是用字典實現,還可以用其他的方式實現。
總結
以上是生活随笔為你收集整理的flask多进程多线程配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微博自定义来源怎么去掉android,手
- 下一篇: php 井字棋,Unity3D 井字棋