การใช้ Gevent ในขวด: API ไม่ใช่แบบอะซิงโครนัส

Aug 18 2020

ก่อนหน้านี้ฉันใช้ Waitress ตอนนี้ฉันใช้Geventเพื่อเรียกใช้แอป Flask ที่มี 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()

ใช้งานได้ดี แต่ API ไม่ตรงกัน หากจากส่วนหน้าฉันเริ่มต้น API เดียวกันสองครั้งในเวลาเดียวกันการเรียกที่สองจะรอให้คำตอบแรกตอบกลับก่อน

มีอะไรผิดปกติที่นี่? ฉันจะทำให้เป็นแบบอะซิงโครนัสได้อย่างไร

คำตอบ

1 AlexWeavers Sep 01 2020 at 14:30

เราใช้ Gunicorn เพื่อเรียกใช้ Flask ในกระบวนการต่างๆ คุณได้รับน้ำผลไม้มากขึ้นจากหลามด้วยวิธีนี้ + รีสตาร์ทอัตโนมัติและสิ่งต่างๆ ไฟล์ config ตัวอย่าง:

import multiprocessing

bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config

จากนั้นเรียกใช้ด้วยสิ่งที่ต้องการ

gunicorn --config /path/to/file application.app
1 pritesh Sep 07 2020 at 06:43

อย่างไรก็ตามฉันไม่แน่ใจว่าการเพิ่มเธรดพารามิเตอร์ในอ็อบเจ็กต์เซิร์ฟเวอร์สามารถแก้ปัญหาได้

http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)

ที่มา: 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