Eine nicht blockierende Anforderung mit Anforderungen, wenn die Laufenden Kolben mit Gunicorn und Gevent

Meine Flask-Anwendung wird eine Anfrage erhalten, einige Berechnungen durchführen, und dann eine Anfrage zu einem langsamen externen Endgeräte-Endpunkt-das dauert 5 Sekunden, um zu reagieren. Wie es aussieht, läuft Gunicorn mit Gevent wird es ermöglichen, behandeln viele dieser langsame-Anfragen zur gleichen Zeit. Wie kann ich ändern Sie das Beispiel unten, so dass die Sicht nicht blockiert?

import requests

@app.route('/do', methods = ['POST'])
def do():
    result = requests.get('slow api')
    return result.content
gunicorn server:app -k gevent -w 4
  • Was erwartest du, was hier geschehen würde? Sie können nicht wieder irgendetwas an den client, wenn Sie noch nicht erhalten haben es noch
  • Ich hatte erwartet, um es async, so dass, wenn es darauf wartet, dass der super-slow-api die cpu-Leistung kann verwendet werden, zu verarbeiten eingehender Anforderungen an, die können möglicherweise gehen den anderen Weg. (Da ich davon ausgehe mit dieser Anwendung erhalten Sie viele andere verschiedene eingehende Anfragen)
  • Das bedeutet nicht, was Sie denken, es bedeutet. Und Gunicorn sollte der Umgang mit diesem für Sie, könnten Sie testen, um sicherzustellen, dass nur durch das hinzufügen einer time.sleep(30) drin, denke ich. Es heißt, der Reaktor-Muster, aber Gunicorn ermöglicht es dem client, um eine Verbindung herzustellen, und dann geht aus der Anfrage an einen worker. Wenn der worker beendet ist, die Daten zurück, die aus der Arbeiter-und steckt es dann zurück in den pool. Ich bin mir nicht sicher, ob es startet eine neue Arbeiter, wenn alle die bestehenden ausgelastet sind, obwohl.
  • Ich bin immer noch lernen, aber ich erwarte ausgeführt Gunicorn sollte so etwas wie gunicorn server:app -k gevent -w 4 aber ich bin mir wirklich nicht sicher.
  • meinst du, dass mit dem aktuellen code, den ich oben gepostet, wenn eine konkrete Anfrage, wartet auf die langsamen api für die Antwort, es wird nur die cpu-Leistung zu verarbeiten, andere eingehende Anfragen an den application server?
  • Naja die CPU sicher, dass Ihr Betriebssystem, das behandeln, wenn der zugrunde liegende socket hat eine .read das OS wird sagen, "Oh, süße, dieser Prozess ist blockiert, laß mich etwas anderes tun".
  • Alles was ich will ist, zu erreichen, so viel rps, wie möglich, ich hatte die Erfahrung, dass langsam blocking IO wird deutlich verringern die rps mein application server verarbeiten kann, und ich möchte vermeiden, dass (vielleicht mit gevent?)
  • Lassen Sie uns weiter, diese Diskussion im chat.

InformationsquelleAutor JLTChiu | 2016-09-28
Schreibe einen Kommentar