[PYTHON] So setzen Sie die Verarbeitung fort, nachdem Sie eine Antwort auf aiohttp Server zurückgegeben haben

Wenn Sie einen Webserver mit aiohttp erstellen und beim Empfang einer HTTP-Anforderung [^ job] einen etwas schweren Prozess ausführen möchten, wird die HTTP-Antwort nur langsam zurückgegeben, und es tritt ein Timeout-Fehler auf der Clientseite auf Es kann verarbeitet werden. Was ist, wenn Sie das Verarbeitungsergebnis nicht zurückgeben müssen und eine HTTP-Antwort zurückgeben, die HTTP-Kommunikation beenden und dann einen etwas schwereren Prozess ausführen möchten?

Wie man "write_eof" </ del> schreibt

** Ich fand diese Methode nicht gut, siehe das Postscript. ** ** **

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)  #Verarbeitung nach Rückgabe einer Antwort


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

if __name__ == '__main__':
    web.run_app(app)
Erstellen Sie einfach ein Antwortobjekt, `prepare` und` write_eof`.

Wenn beim Erstellen des Antwortobjekts nichts angegeben wird, lautet der HTTP-Statuscode 200.

[2020.06 postscript] Es war nutzlos

Wenn bei der obigen Methode die Verbindung mit Keep-Alive für einen bestimmten Zeitraum aufrechterhalten wird, funktioniert sie ohne Probleme, sodass ich sie nicht bemerkt habe, aber im Grunde funktioniert sie nicht gut.

Wenn Sie versuchen, Keep-Alive zu deaktivieren, indem Sie "Connection: close" zum Antwortheader hinzufügen, können Sie feststellen, dass die nachfolgende asynchrone Verarbeitung zum Zeitpunkt von "write_eof ()" nicht ausgeführt wird.

Wenn die Verbindung zum Client unterbrochen wird, wird anscheinend die Verarbeitung des Anforderungshandlers dort gestoppt. (Es war schwer herauszufinden, da es keine Fehlermeldung gab)

Referenz: https://github.com/aio-libs/aiohttp/issues/4773

Als Lösung scheint es besser zu sein, aiojobs zu verwenden.

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


async def job():
    """Der Prozess, den Sie ausführen möchten, nachdem Sie eine Antwort zurückgegeben haben"""
    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

So setzen Sie die Verarbeitung fort, nachdem Sie eine Antwort auf aiohttp Server zurückgegeben haben
So führen Sie Django unter IIS auf einem Windows-Server aus
Ein Hinweis zum Überprüfen der Verbindung zum Lizenzserver-Port
So testen Sie auf einer von Django authentifizierten Seite
Wie man mit 2017 Windows ein anständiges Leben führt
So richten Sie einen lokalen Entwicklungsserver ein
So stellen Sie eine Django-Anwendung in der Alibaba-Cloud bereit
So installieren Sie Linux auf einem 32-Bit-UEFI-PC
Ein Memorandum zur Verwendung von Keras 'keras.preprocessing.image
So erstellen Sie eine Django (Python) -Umgebung auf Docker
So erstellen Sie ein einfaches TCP-Server / Client-Skript
So erstellen Sie eine Python-Umgebung unter Amazon Linux 2
[Linux] So installieren Sie ein Paket auf einem Server ohne Internetumgebung (eigenständig)
Verwendung von Fujifilm X-T3 als Webcam unter Ubuntu 20.04
Ein Hinweis zur einfachen Vorbereitung einer Linux-Übungsumgebung
So führen Sie ein geschultes Transformatormodell lokal auf CloudTPU aus
So erstellen Sie eine neue virtuelle Python-Umgebung unter Ubuntu
SSH-Verbindung zu einem privaten Server über einen Plattformserver in EC2
Wie erstelle ich ein Multiplayer-Online-Actionspiel mit Slack?
So geben Sie das öffentliche Verzeichnis Python Simple HTTP Server an
So mounten Sie ein Windows 10-Verzeichnis unter Ubuntu-Server 20.04 auf VMware Workstation 15.
Hinweise zum Laden einer virtuellen Umgebung mit PyCharm
So schreiben Sie einen Test für die Verarbeitung mit BigQuery
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
So registrieren Sie ein Paket in PyPI (Stand September 2017)
So rufen Sie eine Funktion auf
So registrieren Sie sich bei pypi
Wie man ein Terminal hackt
So stellen Sie cron für reguläres Python-Scraping auf dem Sakura-Server ein.
Ich habe versucht, eine Serverumgebung zu erstellen, die unter Windows 10 ausgeführt wird
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
Wie einfach ist es, ein Medikament auf dem Markt zu synthetisieren?
So passen Sie U-Boot mit einer benutzerdefinierten Karte für OSD335X an (Hinweis)
So erstellen Sie eine Python-Umgebung mit Virtualenv unter Ubuntu 18.04 LTS
So erstellen Sie eine .dylib-Bibliothek aus einer .a-Bibliothek mit OSX (El Capitan)
So stellen Sie eine Django-App in nur 5 Minuten für Heroku bereit
So stellen Sie eine Webanwendung in der Alibaba Cloud als Freiberufler bereit
Wie erstelle ich eine japanisch-englische Übersetzung?
So setzen Sie einen symbolischen Link
So installieren Sie mysql-connector-python auf einem Mac
Hinweise zur Verwendung von Pywinauto
Wie man einen lockeren Bot macht
So erstellen Sie ein Conda-Paket
So installieren Sie das Graph-Tool unter macOS
Führen Sie einen Linux-Server mit GCP aus
So installieren Sie VMware-Tools unter Linux
Wie erstelle ich einen Crawler?
So stellen Sie den Django-Kompressor unter Windows bereit
Hinweise zur Verwendung von featuretools
So erstellen Sie eine virtuelle Brücke
So installieren Sie OpenCV auf einem Mac
Wie man Matplotlib auf Heroku ausführt
So installieren Sie PyPy unter CentOS
Wie benutzt man Homebrew in Debian?
Missverständnisse beim Verbinden von cnn
So installieren Sie TensorFlow unter CentOS 7
Wie erstelle ich eine Docker-Datei?