Comment continuer le traitement après avoir renvoyé une réponse sur aiohttp Server

Si vous créez un serveur Web avec aiohttp et que vous souhaitez exécuter un processus légèrement lourd lors de la réception d'une requête HTTP [^ job], si vous exécutez le processus tel quel, il sera lent à renvoyer une réponse HTTP, et comme une erreur de temporisation côté client Il peut être traité. Que faire si vous n'avez pas besoin de renvoyer le résultat du traitement et que vous souhaitez renvoyer une réponse HTTP pour mettre fin à la communication HTTP, puis effectuer un processus légèrement plus lourd?

Comment write_eof </ del>

** J'ai trouvé cette méthode pas bonne, alors voyez le post-scriptum. ** **

from asyncio import sleep
from aiohttp import web


async def handler(request):
    response = web.Response()
    await response.prepare(request)
    await response.write_eof()

    await sleep(1)  #Traitement après renvoi d'une réponse


app = web.Application()
app.router.add_get('/', handler)

if __name__ == '__main__':
    web.run_app(app)
Créez simplement un objet Response, `prepare` et` write_eof`.

Si rien n'est spécifié lors de la création de l'objet Response, le code d'état HTTP est 200.

[2020.06 postscript] C'était inutile

Avec la méthode ci-dessus, si la connexion est maintenue pendant un certain temps avec keep-alive, cela fonctionne sans problème, donc je ne l'ai pas remarqué, mais en gros cela ne fonctionne pas bien.

Si vous essayez de désactiver la fonction Keep-Alive en ajoutant Connection: close à l'en-tête de la réponse, vous pouvez voir que le traitement asynchrone suivant n'est pas exécuté au moment de write_eof ().

Apparemment, lorsque la connexion avec le client est interrompue, le traitement du gestionnaire de requêtes y est arrêté. (C'était difficile à savoir car il n'y avait pas de message d'erreur)

Référence: https://github.com/aio-libs/aiohttp/issues/4773

Comme solution, il semble préférable d'utiliser aiojobs.

from asyncio import sleep
from aiohttp import web
import aiojobs.aiohttp as aiojobs


async def job():
    """Le processus que vous souhaitez exécuter après avoir renvoyé une réponse"""
    await sleep(1)


async def handler(request):
    await aiojobs.spawn(request, job())
    return web.Response(text='ok')


app = web.Application()
app.router.add_get('/', handler)

aiojobs.setup(app)

if __name__ == '__main__':
    web.run_app(app)

Recommended Posts

Comment continuer le traitement après avoir renvoyé une réponse sur aiohttp Server
Comment exécuter Django sur IIS sur un serveur Windows
Remarque sur la façon de vérifier la connexion au port du serveur de licences
Comment tester sur une page authentifiée par Django
Comment vivre une vie décente avec Windows 2017
Comment configurer un serveur de développement local
Comment déployer une application Django dans le cloud Alibaba
Comment installer Linux sur un PC UEFI 32 bits
Un mémorandum sur l'utilisation de keras.preprocessing.image de Keras
Comment créer un environnement Django (python) sur Docker
Comment créer un simple script serveur / client TCP
Comment créer un environnement Python sur Amazon Linux 2
[Linux] Comment installer un package sur un serveur qui n’a pas d’environnement Internet (autonome)
Comment utiliser Fujifilm X-T3 comme webcam sur Ubuntu 20.04
Une note sur la façon de préparer facilement un environnement de pratique Linux
Comment exécuter un modèle de transformateur entraîné localement sur CloudTPU
Comment créer un nouvel environnement virtuel Python sur Ubuntu
Connexion SSH à un serveur privé à l'aide d'un serveur de plateforme dans EC2
Comment créer un jeu d'action multijoueur en ligne avec Slack
Comment spécifier un serveur HTTP simple Python de répertoire public
Comment monter un répertoire Windows 10 sur Ubuntu-Server 20.04 sur VMware Workstation 15.
Remarques sur la façon de charger un environnement virtuel avec PyCharm
Comment rédiger un test de traitement utilisant BigQuery
[Introduction à AWS] Mémorandum de création d'un serveur Web sur AWS
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
Comment appeler une fonction
Comment s'inscrire auprès de pypi
Comment pirater un terminal
Comment configurer cron pour le scraping Python normal sur le serveur Sakura.
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
Présentation de la création d'un socket serveur et de la création d'un socket client
Est-il facile de synthétiser un médicament sur le marché?
Comment personnaliser U-Boot avec une carte personnalisée pour OSD335X (Remarque)
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
Comment créer une bibliothèque .dylib à partir d'une bibliothèque .a avec OSX (El Capitan)
Comment déployer une application Django sur heroku en seulement 5 minutes
Comment déployer une application Web sur Alibaba Cloud en tant que pigiste
Comment faire une traduction japonais-anglais
Comment mettre un lien symbolique
Comment installer mysql-connector-python sur Mac
Remarques sur l'utilisation de pywinauto
Comment créer un bot slack
Comment créer un package Conda
Comment installer Graph-Tool sur macOS
Exécutez un serveur Linux avec GCP
Comment installer VMware-Tools sur Linux
Comment installer pycrypto sur Windows
Comment créer un robot - Avancé
Comment déployer django-compresseur sous Windows
Remarques sur l'utilisation des featuretools
Comment créer un pont virtuel
Comment installer OpenCV sur Mac
Comment exécuter matplotlib sur heroku
Comment installer PyPy sur CentOS
Comment utiliser l'homebrew dans Debian
Malentendu sur la façon de connecter CNN
Comment installer TensorFlow sur CentOS 7
Comment créer un Dockerfile (basique)