鍍金池/ 問答/Python/ python flask如何解決同時(shí)請求同一個(gè)請求的阻塞問題?

python flask如何解決同時(shí)請求同一個(gè)請求的阻塞問題?

from flask import Flask
import time

app = Flask(__name__)

@app.route('/test)
def sayHello():
    time.sleep(10)
    return 'hello'

@app.route('/hi')
def sayHi():
    return 'hi'
if __name__ =='__main__'
    app.run(debug=True,threaded = True)

如上述代碼所示,倘若在瀏覽器打開多張空白頁,然后都去請求 127.0.0.1:5000/test ,會(huì)發(fā)現(xiàn)進(jìn)入了阻塞狀態(tài),每一張頁面會(huì)等待它之前的那個(gè)請求結(jié)束后在加載當(dāng)前頁面。但是去訪問 127.0.0.1:5000/hi 卻不會(huì)收到前面那個(gè)網(wǎng)址的影響

所以,我應(yīng)該如何實(shí)現(xiàn) 我多個(gè)請求去訪問 127.0.0.1:5000/test 這個(gè)不受其他的影響,能夠同時(shí)加載?

回答
編輯回答
抱緊我

可以用gevet啊

from gevent import monkey
from gevent.pywsgi import WSGIServer
monkey.patch_all()
from flask import Flask
import time

app = Flask(__name__)

@app.route('/test',methods=['GET'])
def sayHello():
    time.sleep(10)
    return 'hello'

@app.route('/hi',methods=['GET'])
def sayHi():
    return 'hi'
if __name__ =='__main__':
    http_server = WSGIServer(('', 5000), app)
    http_server.serve_forever()

測試結(jié)果:
127.0.0.1 - - [2017-12-12 22:35:10] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:11] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:11] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:12] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:12] "GET /test/ HTTP/1.1" 200 126 0.000998
127.0.0.1 - - [2017-12-12 22:35:13] "GET /test/ HTTP/1.1" 200 126 0.001001
127.0.0.1 - - [2017-12-12 22:35:14] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:14] "GET /test/ HTTP/1.1" 200 126 0.001014
127.0.0.1 - - [2017-12-12 22:35:15] "GET /test/ HTTP/1.1" 200 126 0.001000
127.0.0.1 - - [2017-12-12 22:35:15] "GET /test/ HTTP/1.1" 200 126 0.000000
127.0.0.1 - - [2017-12-12 22:35:18] "GET /asyn/ HTTP/1.1" 200 126 10.000392

2017年4月7日 12:48
編輯回答
話寡

后來發(fā)現(xiàn)了問題,因?yàn)槲矣枚际莄hrome瀏覽器。如果我每次請求的參數(shù),url等任何元素都是相同的,瀏覽器會(huì)判定為這兩個(gè)時(shí)為同一個(gè)請求,所以當(dāng)前一個(gè)請求沒有結(jié)束的時(shí)候 后一個(gè)一模一樣的請求也不能產(chǎn)生結(jié)果。但是在Python的flask當(dāng)中,他默認(rèn)是單線程,就是只能一個(gè)一個(gè)請求來處理,通過gevent等框架可以并發(fā)地處理請求,而gunicorn作為httpserver來啟動(dòng)程序時(shí),相當(dāng)于是多進(jìn)程的所以也能夠同時(shí)處理很多請求(這是我自己的理解,如果有不對的地方請支教?。?/p>

2017年3月17日 05:29
編輯回答
陌璃

我認(rèn)為訪問hi也會(huì)受到test的影響。
言歸正傳,你可以使用gevent,在文件開頭:

from gevent import monkey
monkey.patch_all()
2017年10月14日 04:50
編輯回答
薄荷糖

正是部署的時(shí)候,建議用nginx+uwsgi+flask的形式。

2018年3月16日 16:48