Gevent'i şişede kullanma: API eşzamansız değildir
Daha önce Garson kullanıyordum. Şimdi sadece bir API'ye sahip Flask uygulamamı çalıştırmak için Gevent kullanıyorum
from flask import Flask, request, jsonify
import documentUtil
from gevent.pywsgi import WSGIServer
app = Flask(__name__)
@app.route('/post-document-string', methods=['POST'])
def parse_data():
req_data = request.get_json(force=True)
text = req_data['text']
result = documentUtil.parse(text)
return jsonify(keywords = result)
if __name__=='__main__':
http_server = WSGIServer(('127.0.0.1', 8000), app)
http_server.serve_forever()
Bu iyi çalışıyor. Ancak API eşzamansız değildir. Ön uçtan aynı API'yi aynı anda iki kez çalıştırırsam, ikinci çağrı ilkinin önce yanıt vermesini bekler.
Burada sorun ne? Nasıl eşzamansız hale getirebilirim?
Yanıtlar
Flask'ı birden fazla işlemde çalıştırmak için Gunicorn kullanıyoruz. Bu şekilde python'dan daha fazla meyve suyu elde edersiniz + otomatik yeniden başlatmalar ve benzeri şeyler. Örnek yapılandırma dosyası:
import multiprocessing
bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config
Sonra şöyle bir şeyle koş
gunicorn --config /path/to/file application.app
Emin değilim, ancak sunucu nesnesine iş parçacığı parametresi eklemenin sorunu çözebileceğini düşünüyorum .
http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)
kaynak: https://f.gallai.re/wsgiserver
"""index.py"""
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/')
def index():
"""Main page"""
doc = {
'site': 'stackoverflow',
'page_id': 6347182,
'title': 'Using Gevent in flask'
}
return jsonify(doc)
# To start application
gunicorn -k gevent --bind 0.0.0.0 index:app
k : worker_class
--bind : bind address
# See https://docs.gunicorn.org/en/latest/settings.html