web-dev-qa-db-fra.com

Arrêter le traitement Flask route si la demande a été abandonnée

J'ai un flask _ _ REST point final qui fait un traitement de l'image intensive de la CPU et prend quelques secondes à revenir. Souvent, ce noeud final est appelé, puis avorté par le client. Dans ces situations, je voudrais annuler le traitement. Comment puis-je faire cela dans le flacon?

Dans Node.Js, je ferais quelque chose comme:

req.on('close', function(){
  //some handler
});

Je m'attendais à flask _ d'avoir quelque chose de similaire, ou d'une méthode synchrone (demande.isplose ()) que je pouvais vérifier à certains points au cours de mon traitement et de retour si c'est fermé, mais je ne peux en trouver un.

J'ai pensé à envoyer quelque chose à tester que la connexion est toujours ouverte et à attraper l'exception si elle échoue, mais il semble que Flask tampons toutes les sorties de sorte que l'exception ne soit pas lancée tant que le traitement ne se termine pas. le résultat:

Une connexion établie a été annulée par le logiciel de votre machine hôte.

Comment puis-je annuler mon traitement à mi-chemin si le client abandonne sa demande?

32
Crashthatch

J'essayais juste de faire cette même chose dans un projet et j'ai constaté qu'avec ma pile d'UWSGI et NGinx que lorsqu'une réponse en streaming a été interrompue sur la fin du client que les erreurs suivantes ont eu lieu.

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request
uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 404] during GET
IOError: write error

et je pouvais simplement utiliser un ancien try et _ except comme ci-dessous

    try:
        for chunk in iter(process.stdout.readline, ''):
            yield chunk
        process.wait()
    except:
        app.logger.debug('client disconnected, killing process')
        process.terminate()
        process.wait()

Cela m'a donné:

  1. Streaming instantané des données utilisant la fonctionnalité génératrice de la fiole
  2. Aucun processus de zombie sur la connexion annulée
1
Emory Petermann