Menggunakan Gevent di flask: API tidak asinkron
Sebelumnya saya menggunakan Waitress. Sekarang saya menggunakan Gevent untuk menjalankan aplikasi Flask saya yang hanya memiliki satu API
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()
Ini bekerja dengan baik. Tetapi API tidak asinkron. Jika dari front-end, saya mengaktifkan API yang sama dua kali pada saat yang sama, panggilan kedua menunggu yang pertama memberikan respon terlebih dahulu.
Ada apa disini? Bagaimana cara membuatnya asynchronous?
Jawaban
Kami menggunakan Gunicorn untuk menjalankan Flask dalam banyak proses. Anda mendapatkan lebih banyak jus dari python dengan cara itu + restart otomatis dan sebagainya. Contoh file konfigurasi:
import multiprocessing
bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config
Kemudian jalankan dengan sesuatu seperti
gunicorn --config /path/to/file application.app
Tidak yakin, namun saya pikir menambahkan parameter utas di objek server dapat menyelesaikan masalah.
http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)
sumber: 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