[Flask] 異步非阻塞IO實現


Flask默認是不支持非阻塞IO的,表現為:

請求1未完成之前,請求2是需要等待處理狀態,效率非常低。
在flask中非阻塞實現可以由2種:
  • 啟用flask多線程機制
# Flask from flask import Flask, request, g import os import sys reload(sys) sys.setdefaultencoding('utf-8') app = Flask(__name__) app.config.update(DEBUG=True) #獲取本機電腦名 myname = socket.getfqdn(socket.gethostname( )) #獲取本機ip myaddr = socket.gethostbyname(myname) myport = 8912 @app.route('/test1') def the_test1(): print "test1 print start" time.sleep(10) print "test1 print after sleep" return 'hello asyn' @app.route('/test2') def the_test2(): print "test2 print!" return 'test2 return' if __name__ == '__main__': app.run(host=myaddr,port=myport,debug=False,threaded=True) ### threaded開啟以后 不需要等隊列 threaded=True #或者 #app.run(host=myaddr,port=myport,debug=False,processes=3) ### processes=N 進程數量,默認為1個 
  • 啟用monkey模塊socket支持

其中使用了Gevent 是一個 Python 並發網絡庫,它使用了基於libevent 事件循環的 greenlet 來提供一個高級同步 API。下面是代碼示例:

from gevent.wsgi import WSGIServer
from yourapplication import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

# Flask from flask import Flask, request, g import os import sys reload(sys) sys.setdefaultencoding('utf-8') # gevent from gevent import monkey from gevent.pywsgi import WSGIServer monkey.patch_all() # gevent end app = Flask(__name__) app.config.update(DEBUG=True) #獲取本機電腦名 myname = socket.getfqdn(socket.gethostname( )) #獲取本機ip myaddr = socket.gethostbyname(myname) myport = 8912 @app.route('/test1') def the_test1(): print "test1 print start" time.sleep(10) print "test1 print after sleep" return 'hello asyn' @app.route('/test2') def the_test2(): print "test2 print!" return 'test2 return' if __name__ == '__main__': http_server = WSGIServer((myaddr, myport), app) http_server.serve_forever()

 


免責聲明!

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



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