Flask 處理高並發、多線程


 

https://zhuanlan.zhihu.com/p/102716258

Gunicorn介紹

壓力測試 多線程測試

 

 

 

https://www.jianshu.com/p/79489cfc6fb9

 

1.通過設置app.run()的參數,來達到多線程的效果,具體參數:

# 1.threaded : 多線程支持,默認為False,即不開啟多線程; app.run(threaded=True) # 2.processes:進程數量,默認為1. app.run(processes=True) ps:多進程或多線程只能選擇一個,不能同時開啟

多進程,多線程部署

通過配置app.run()中的參數實現多進程或者多線程部署,默認是多線程的,即多個客戶端同時調用訪問restful接口,這個服務程序是以多線程方式處理的
可以通過修改:
app.run(host=‘0.0.0.0’, port=5001,debug=False,threaded = False,processes=5)
配置為多進程處理,如上,多個客戶端同時訪問的話,是多進程處理,如此出processes=5,是最多支持5個客戶端同時訪問,超過了就需要等待處理完或者直接不處理,客戶端會得不到響應。所以此處processes可以根據實際情況配置的大一點,比如幾百甚至上千。
需要特別注意的是,此處必須同時配置threaded = False和processes的個數,將多線程模式禁用同時開啟多進程模式,否則會編譯報錯
除此之外,還可以在程序中自己創建多進程,比如:

  @app.route('/app', methods=['POST'])
 def func():
         records = request.json['record']
        content_list = [record['content'] for record in records]
         id_list = [record['id'] for record in records]
        from multiprocessing import Pool
        p = Pool(8)
        result = p.map(cse_obj.findeKword, content_list)
        p.close()
        p.join() 

此處在接口的實現函數中又會用進程池創建8個子進程,此處無論flask是進程式還是線程式,都會另外創建8個子進程,處理完之后子進程會回收, 不過值得注意的是,用pool創建進程池,以及進程之間的切換等等也會消耗時間,自測在處理一批批的文本數據時,如果每批文本數量比較少,比如只有幾百個,直接循環處理某些情況下比建進程池多進程處理要快,所以要追求效率,進程的創建以及資源切換都要考慮到
客戶端發送數據的格式需要與接收端的格式相對應,雙方要約定好數據的格式,所以需要對提供的接口的調用字段格式及返回字段格式,提供相配套的接口說明文檔,給需要調用服務的人員

2.使用genvent做協程,解決高並發:

from genvent.wsgi import  WSGIServer
from genvent import monkey

monkey.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進行包裝,來啟動服務;

https://zhuanlan.zhihu.com/p/102716258

 


通過一下代碼,來啟動項目

# 啟動命令
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM