Menggunakan Gevent di flask: API tidak asinkron

Aug 18 2020

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

1 AlexWeavers Sep 01 2020 at 14:30

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
1 pritesh Sep 07 2020 at 06:43

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

1 EM28 Sep 07 2020 at 23:17
"""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