Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders

Zusammenfassung

Cloud Run war GA. Ich wollte ein Python-Skript ausprobieren, das früher lokal ausgeführt wurde, und etwas Zeit für die Ausführung in Cloud Run benötigen. In Cloud Run ausgeführte Container müssen in der Lage sein, Anforderungen über HTTP zu empfangen und auszuführen. Cloud Run muss auch Anforderungszeitlimits berücksichtigen. Ich werde den Responder vorstellen, da es einfach war, das Skript schnell auszuführen, ohne das Zeitlimit für die Anforderung zu berücksichtigen.

Prämissengeschichte

Versuchte Umgebung

responder

Das HTTP-Service-Framework von Python. Da es ASGI (Asynchronous Server Gateway Interface) implementiert, kann es auch eine asynchrone Verarbeitung durchführen, wie der Name Asynchronous impliziert. Die asynchrone Verarbeitung selbst kann mit anderen Frameworks durchgeführt werden. Als ich mir jedoch kurz Flask und Django ansah, die für das Python-Framework bekannt sind, musste ich zusätzliche Pakete installieren und die Konfigurationsdatei ändern. Mit Blick auf den Beispielcode des Responders schien es einfach zu installieren und zu implementieren, also habe ich versucht, ihn zu verwenden.

Was ich getan habe

Informationen zur Verzeichnisstruktur und zu jeder Datei

vaivailx@MacBook-Pro-2 responder_sample_for_cloudrun % tree -L 3 .
.
├── Dockerfile
├── requirements.txt
└── src
    ├── sample.py
    └── webapp.py

Jede Python-Datei führt Folgendes aus:

Dies ist alles require.txt.

responder==2.0.4

Aktualisieren Sie in der Docker-Datei das Paket mit apt und installieren Sie das in den Anforderungen.txt beschriebene Paket.

FROM python:3.7.5-buster

ENV APP_HOME /app
WORKDIR $APP_HOME
ADD ./requirements.txt /app
ADD ./src /app

# Avoid warnings by switching to noninteractive
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
    && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \
    # Install pylint
    && pip --disable-pip-version-check --no-cache-dir install pylint \
    # Update Python environment based on requirements.txt
    && pip --disable-pip-version-check --no-cache-dir install -r requirements.txt \
    && rm -rf requirements.txt \
    # Clean up
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

# Switch back to dialog for any ad-hoc use of apt-get
ENV DEBIAN_FRONTEND=

# run app
ENV PORT '8080'
CMD python3 webapp.py
EXPOSE 8080

Verarbeitung zum Akzeptieren von HTTP-Anforderungen mithilfe des Responders. Stellen Sie "def" einfach "async" voran und die Funktion ist asynchron.

webapp.py

import logging

import responder

from sample import process_sample

logging.basicConfig(filename=f'/var/log/webapp.log', level=logging.DEBUG)

api = responder.API()

@api.route("/async")
async def asyncsample(req, resp):

    @api.background.task
    def process_param(params):
        t = int(params.get('time', 10))
        process_sample(t)

    process_param(req.params)
    resp.media = {'async success': True}

@api.route("/sync")
def syncsample(req, resp):

    t = int(req.params.get('time', 10))
    process_sample(t)
    resp.media = {'sync success': True}

if __name__ == '__main__':
    api.run()

Das Protokoll wird ausgegeben, da es zur Laufzeit mit Croud Run bestätigt werden kann. Wie der Routenname andeutet, wird beim Zugriff auf den Root-Pfad / Async eine asynchrone Verarbeitung ausgeführt, und beim Zugriff auf den Root-Pfad / die Synchronisierung wird die Motivationsverarbeitung ausgeführt. Dieses Mal habe ich versucht, für den Wert des Abfrageparameters zu schlafen.

sample.py

import time
import logging

def process_sample(secs):
    logging.debug('process starts.')
    time.sleep(secs)
    logging.debug('process ends.')

Bestätigung des Ausführungsergebnisses in Cloud Run

Stellen Sie nun das Zeitlimit für Cloud Run-Anforderungen auf 30 Sekunden ein und führen Sie es aus. (Da das Warten auf 5 Minuten mühsam ist, habe ich den Standardwert geändert.)

** Synchrone Ausführung: Ausführungszeit 10 Sekunden **

vaivailx@cloudshell:~ (cloudrun-test-259804)$ date;curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://responderasync-jpwo3ltkhq-an.a.run.app/sync?time=10
Fri Dec 13 09:52:59 +09 2019
{"sync success": true}vaivailx@cloudshell:~ (cloudrun-test-259804)$
sync10_result.png

→ Normal fertig

** Synchrone Ausführung: Ausführungszeit 40 Sekunden **

vaivailx@cloudshell:~ (cloudrun-test-259804)$ date;curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://responderasync-jpwo3ltkhq-an.a.run.
app/sync?time=40
Fri Dec 13 09:55:45 +09 2019
upstream request timeoutvaivailx@cloudshell:~ (cloudrun-test-259804)$
sync40_result.png

→ Zeitüberschreitung

** Asynchrone Ausführung: Ausführungszeit 10 Sekunden **

vaivailx@cloudshell:~ (cloudrun-test-259804)$ date;curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://responderasync-jpwo3ltkhq-an.a.run.app/async?time=10
Fri Dec 13 10:02:31 +09 2019
{"async success": true}vaivailx@cloudshell:~ (cloudrun-test-259804)$
async10_result.png

→ Normal beendet

** Asynchrone Ausführung: Ausführungszeit 40 Sekunden **

vaivailx@cloudshell:~ (cloudrun-test-259804)$ date;curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://responderasync-jpwo3ltkhq-an.a.run.app/async?time=40
Fri Dec 13 10:03:57 +09 2019
{"async success": true}vaivailx@cloudshell:~ (cloudrun-test-259804)$
async40_result.png

→ Normal fertig

Was ich übrigens bestätigt habe

Übrigens betrug das Zeitlimit für HTTP-Anforderungen auf dem Einstellungsbildschirm bis zu 900 Sekunden, dies ist jedoch nicht die Ausführungszeit Es ist die Zeit, die benötigt wird, um eine Anfrage zu empfangen und eine Antwort zurückzugeben, und ich konnte bestätigen, dass dies 900 Sekunden oder länger möglich ist, wenn es asynchron gemacht wird. Das Folgende ist das Ergebnis einer asynchronen Ausführung für 1200 Sekunden.

async1200_result.png

Schließlich

Recommended Posts

Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Holen Sie sich Suica Balance in Python (mit libpafe)
Melden Sie sich mit Anforderungen in Python bei Slack an
Wie bekomme ich Stacktrace in Python?
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
So wechseln Sie die Python-Version in Cloud9
Holen Sie sich die Cloud-Protokollierung in Python in 10 Minuten
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
So erhalten Sie die Dateien im Ordner [Python]
So führen Sie LeapMotion mit Nicht-Apple Python aus
Was tun, um eine Google-Tabelle in Python zu erhalten?
Verwenden Sie os.getenv, um Umgebungsvariablen in Python abzurufen
Was tun, wenn "Python nicht konfiguriert" angezeigt wird? Verwenden von PyDev in Eclipse
Holen Sie sich Datum in Python
Cloud Run Tutorial (Python)
Profilieren Sie schnell Python-Skripte
So erhalten Sie den Variablennamen selbst in Python
So ermitteln Sie die Anzahl der Stellen in Python
So führen Sie Python im virtuellen Raum aus (für MacOS)
So führen Sie Tests zusammen mit Python unittest aus
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Wie man setUp nur einmal in Python unittest ausführt
Beenden bei Verwendung von Python in Terminal (Mac)
So rufen Sie mehrere Arrays mit Slice in Python ab.
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Holen Sie sich YouTube-Kommentare in Python
Versuchen Sie es mit GUI, PyQt in Python
So löschen Sie stdout in Python
Holen Sie sich letzten Monat in Python
Führen Sie automatisierte Jobs in Python aus
Importieren Sie Skripte dynamisch in Python
Führen Sie Shell-Befehle in Python aus
Führen Sie Python unittest parallel aus
Melden Sie sich auf der Website in Python an
Verwenden von Verticalenv in Shell-Skripten
Mit Python auf Twitter posten
Entwickelte eine Bibliothek, um die Kindle-Sammlungsliste in Python abzurufen
[OCI] Python-Skript zum Abrufen der IP-Adresse einer Recheninstanz in Cloud Shell
Starten Sie mit Python zu Selen
[Frage] So erhalten Sie die Daten von Textbereichsdaten in Echtzeit mithilfe der Python-Webframework-Flasche
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Führen Sie den in Python (Flask) implementierten LINE Bot "ohne Verwendung von Heroku" aus.
Holen Sie sich die Terminalgröße in Python
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Holen Sie sich explizit EOF in Python
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
So führen Sie Notepad ++ Python aus
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Wie man in Python entwickelt
Holen Sie sich Evernote-Notizen in Python
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
Ich möchte Python mit VS-Code ausführen können