Python 2-Laufzeitumgebung

App Engine bietet Ihnen die Möglichkeit, Webanwendungen mithilfe der Python-Programmiersprache zu erstellen. Sie können dabei die zahlreichen Bibliotheken, Tools und Frameworks für Python nutzen, mit denen professionelle Entwickler erstklassige Webanwendungen erstellen. Ihre Python-Anwendung wird in der skalierbaren Google-Infrastruktur ausgeführt, die umfassende beständige Speicher- und Dienstvoraussetzungen bietet.

Einführung

App Engine führt Python-Anwendungscode mit einem vorinstallierten Python-Interpreter in einer sicheren Sandbox-Umgebung aus. Eine Anwendung interagiert mit dieser Umgebung, um Webanfragen zu empfangen, zu verarbeiten und Antworten zu senden.

Da Python-Webanwendungen mithilfe des WSGI-Protokolls mit dem App Engine-Webserver interagieren, können Anwendungen ein beliebiges mit WSGI kompatibles Webanwendungs-Framework verwenden. App Engine enthält für den leichten Einstieg ein einfaches Webanwendungs-Framework namens webapp2. Bei größeren Anwendungen eignen sich ausgereifte Drittanbieter-Frameworks wie Django gut für die Arbeit mit App Engine.

Der Python-Interpreter kann beliebigen Python-Code ausführen. Hierzu zählen auch von Ihnen in Ihre Anwendung eingebundene Python-Module sowie die Python-Standardbibliothek. Der Interpreter kann keine Python-Module mit C-Code laden. Es ist eine "reine" Python-Umgebung.

Ihre Anwendung wird in der geschützten Sandbox-Umgebung für die sichere Ausführung isoliert. Die Umgebung gewährleistet, dass Anwendungen während der Ausführung weder die Leistung noch die Skalierbarkeit anderer Anwendungen beeinträchtigen. Eine Anwendung kann beispielsweise keine Daten in das lokale Dateisystem schreiben und keine beliebigen Netzwerkverbindungen herstellen. Stattdessen verwenden Anwendungen die skalierbaren Dienste von App Engine, um Daten zu speichern oder über das Internet zu kommunizieren. Der Python-Interpreter löst eine Ausnahme aus, wenn eine Anwendung versucht, ein Python-Modul aus der Standardbibliothek zu importieren, von dem bekannt ist, dass es innerhalb der Sandbox-Einschränkungen nicht funktioniert.

Die App Engine-Plattform bietet zahlreiche Dienste, die Ihr Code aufrufen kann. Außerdem kann Ihre Anwendung geplante Aufgaben konfigurieren, die in bestimmten Intervallen ausgeführt werden.

Python 2-Laufzeit auswählen

Die Python-Laufzeitumgebung legen Sie in der Konfigurationsdatei app.yaml fest, mit der Sie Ihre Anwendung in App Engine bereitstellen. Der Datei app.yaml fügen Sie beispielsweise Folgendes hinzu, um Python in der Version 2.7 zu verwenden:

runtime: python27
api_version: 1
threadsafe: true
...

Mit dem ersten Element, runtime, wird die Python-Laufzeitumgebung ausgewählt.

Das zweite Element, api_version, dient zur Auswahl der Version der zu verwendenden Python-Laufzeitumgebung. Ab sofort ist in App Engine nur die Version 1 der Python-Umgebung verfügbar. Sollte das App Engine-Team Änderungen an der Umgebung vornehmen, die nicht mit bereits vorhandenem Code kompatibel sind, werden diese unter einer neuen Version veröffentlicht. Ihre Anwendung verwendet dann weiterhin die ausgewählte Version, bis Sie die api_version-Einstellung ändern und Ihre Anwendung neu hochladen.

Weitere Informationen zur app.yaml-Datei und wie Sie Ihre Anwendung in App Engine bereitstellen, finden Sie in der app.yaml-Referenz unter Migration zu Python 2.7 und Python-Anwendung bereitstellen.

Sandbox

Damit App Engine Anfragen für Anwendungen auf mehrere Webserver verteilen und verhindern kann, dass sich Anwendungen gegenseitig stören, wird die Anwendung in einer isolierten Sandbox-Umgebung ausgeführt. In dieser Umgebung kann die Anwendung Programmcode ausführen, Daten in Datastore speichern und abfragen, die Mail-, URL-Abruf- und Nutzerdienste vom App Engine verwenden sowie die Webanfrage des Nutzers prüfen und die Antwort vorbereiten.

Folgendes ist mit einer App Engine-Anwendung nicht möglich:

  • In das Dateisystem schreiben. Anwendungen müssen nichtflüchtige Daten in Datastore speichern. Das Lesen des Dateisystems ist zulässig. Dabei sind alle Anwendungsdateien verfügbar, die mit der Anwendung hochgeladen wurden.

  • Langsame Antworten. Eine an eine Anwendung gerichtete Webanfrage muss innerhalb weniger Sekunden verarbeitet werden. Prozesse mit langen Antwortzeiten werden beendet, damit der Webserver nicht überlastet wird.

  • Andere Arten von Systemaufrufen durchführen.

Sandboxing in Python

Sie können .pyc- Dateien mit der Python 2.7-Laufzeit hochladen und verwenden, jedoch keine .py- und .pyc- Versionen derselben Datei. Sie können ZIP-Dateien hochladen, die .py- oder .pyc- Dateien oder eine Kombination dieser Dateien enthalten. Das Hochladen von .pyc-Dateien ist mit verschiedenen Einschränkungen verbunden:

  • Bei einem CGI-Skript sollte der Skript-Handler weiterhin die Dateierweiterung .py verwenden, auch wenn Sie eine .pyc-Datei hochladen.
  • Standardmäßig werden .pyc-Dateien während der Bereitstellung übersprungen. Sie müssen das skip_files-Element in Ihrer app.yaml-Datei überschreiben, damit der neue Wert nicht dazu führt, dass .pyc-Dateien übersprungen werden.
  • Sie müssen Python 2.7 verwenden, um die Datei .pyc zu erstellen. Wenn Sie eine andere Version von Python (z. B. Python 2.6) auf Ihrer Entwicklungsmaschine haben, benötigen Sie Version 2.7, um eine kompatible .pyc-Datei zu erstellen.

Reines Python 2

Sämtlicher Code für die Python-Laufzeitumgebung muss reiner Python-Code sein. Es dürfen weder C-Erweiterungen noch andere zu kompilierende Codeelemente enthalten sein.

Die Umgebung enthält die Python-Standardbibliothek. Manche Module wurden deaktiviert, da ihre Kernfunktionen von App Engine nicht unterstützt werden. Hierzu zählen die Netzwerkfunktion sowie das Schreiben in das Dateisystem. Dabei ist das os-Modul zwar verfügbar, nicht unterstützte Funktionen wurden aber deaktiviert. Wenn Sie ein nicht unterstütztes Modul importieren oder eine nicht unterstützte Funktion aufrufen, wird eine Ausnahme ausgelöst.

Manche Module der Standardbibliothek wurden ersetzt oder für die Verwendung mit App Engine angepasst. Diese Module variieren wie unten beschrieben zwischen den beiden Python-Laufzeiten.

Benutzerdefinierte Bibliotheken in Python Version 2.7

In der Laufzeit von Python Version 2.7 wurden die folgenden Module ersetzt oder angepasst:

  • tempfile ist deaktiviert, mit Ausnahme von TemporaryFile, das als Alias StringIO verwendet.

  • Logging ist verfügbar und wird dringend empfohlen. Weitere Informationen finden Sie unter Logging.

Neben der Python-Standardbibliothek und den App Engine-Bibliotheken beinhaltet die Laufzeit von Python Version 2.7 mehrere Drittanbieterbibliotheken.

Python-Bibliotheken von Drittanbietern hinzufügen

Sie können Python-Bibliotheken von Drittanbietern in Ihre Anwendung einbinden, indem Sie den Code in Ihr Anwendungsverzeichnis einfügen. Wenn Sie in Ihrem Anwendungsverzeichnis eine symbolische Verknüpfung zum Verzeichnis einer Bibliothek erstellen, wird diese Verknüpfung verwendet und die Bibliothek in die in App Engine bereitgestellte Anwendung eingebunden.

Der Include-Pfad des Python-Moduls enthält das Stammverzeichnis Ihrer Anwendung. Dies ist das Verzeichnis mit der Datei app.yaml. Python-Module, die Sie im Stammverzeichnis Ihrer Anwendung erstellen, stehen über einen Pfad vom Stammverzeichnis aus zur Verfügung. Vergessen Sie nicht, die erforderlichen __init__.py-Dateien in Ihren Unterverzeichnissen zu erstellen, damit Python diese Unterverzeichnisse als Pakete erkennt. Achten Sie außerdem darauf, dass Ihre Bibliotheken keine C-Erweiterungen benötigen.

Threads

Threads können in Python Version 2.7 mit den Modulen thread oder threading erstellt werden. Beachten Sie, dass Threads bei Beendigung der Anfrage von der Laufzeit verbunden werden. Threads können somit nicht über das Ende der Anfrage hinaus ausgeführt werden.

Hintergrundthreads

Code, der auf einer Instanz mit manueller oder einfacher Skalierung ausgeführt wird, kann einen Hintergrundthread starten, der die Anfrage überdauert, die ihn generiert. So kann eine Instanz beliebige regelmäßige oder geplante Aufgaben ausführen oder im Hintergrund laufen, nachdem eine Anfrage an den Nutzer zurückgegeben wurde.

Der os.environ und die Log-Einträge eines Hintergrundthreads sind von denen des erzeugenden Threads unabhängig.

Sie müssen das Modul google.appengine.api.background_thread aus dem SDK für App Engine importieren.

from google.appengine.api import background_thread

Die Klasse BackgroundThread ähnelt der normalen Python-Klasse threading.Threadclass, kann jedoch die Anfrage überdauern, durch die sie generiert wurde. Mit der Funktion start_new_background_thread() wird ein Hintergrundthread erstellt und gestartet:

# sample function to run in a background thread
def change_val(arg):
    global val
    val = arg

if auto:
    # Start the new thread in one command
    background_thread.start_new_background_thread(change_val, ['Cat'])
else:
    # create a new thread and start it
    t = background_thread.BackgroundThread(
        target=change_val, args=['Cat'])
    t.start()
Die maximale Anzahl gleichzeitiger Hintergrundthreads, die von der App Engine API erstellt werden kann, liegt bei 10 Threads pro Instanz. (Dieses Limit gilt nicht für reguläre Java-Threads, die nicht mit der App Engine API in Zusammenhang stehen.)

Tools

Das SDK für App Engine umfasst Tools zum Testen Ihrer Anwendung, Hochladen Ihrer Anwendungsdateien, Verwalten von Datenspeicherindexen, Herunterladen von Logdaten und Hochladen großer Datenmengen in den Datastore.

Während der Testphase führt der Entwicklungsserver Ihre Anwendung auf Ihrem lokalen Computer aus. Der Server simuliert dabei die Datastore-Dienste und Sandbox-Einschränkungen. Der Entwicklungsserver erstellt auch die Konfiguration für Datenspeicherindizes anhand der Abfragen, die von der Anwendung während der Testphase durchgeführt werden.

Das gcloud-Tool steuert alle Befehlszeileninteraktionen mit Ihrer Anwendung, die in App Engine ausgeführt wird. Mit gcloud app deploy laden Sie Ihre Anwendung in App Engine hoch oder aktualisieren individuelle Konfigurationsdateien etwa für die Datastore-Indexkonfiguration. Auf diese Weise können Sie vor der Codebereitstellung neue Indexe erstellen. Sie haben auch die Möglichkeit, die Logdaten der Anwendung aufzurufen, um ihre Leistung mit eigenen Tools zu analysieren.

Gleichzeitigkeit und Latenz

Die Latenz Ihrer Anwendung hat den größten Einfluss auf die Anzahl der Instanzen, die für die Verarbeitung Ihres Traffics erforderlich ist. Wenn Sie Anfragen schnell verarbeiten, kann eine einzelne Instanz viele Anfragen bewältigen.

Einzelthread-Instanzen können jeweils eine gleichzeitige Anfrage verarbeiten. Daher besteht ein direkter Zusammenhang zwischen der Latenz und der Anzahl der Anfragen, die pro Sekunde auf der Instanz verarbeitet werden können. Zum Beispiel entspricht eine Latenz von 10 ms 100 Anfragen pro Sekunde und pro Instanz.

Multithread-Instanzen können viele gleichzeitige Anfragen verarbeiten. Daher besteht ein direkter Zusammenhang zwischen der verbrauchten CPU und der Anzahl der Anfragen pro Sekunde.

Anwendungen der Python Version 2.7 unterstützen gleichzeitige Anfragen. Eine einzelne Instanz kann somit während laufender Anfragen gleichzeitig neue Anfragen verarbeiten. Durch die Gleichzeitigkeit wird die Anzahl der Instanzen, die Ihre Anwendung benötigt, erheblich reduziert. Allerdings müssen Sie Multithreading beim Entwurf Ihrer Anwendung integrieren.

Wenn beispielsweise eine B4-Instanz (ca. 2,4 GHz) 10 Mega-Prozessorzyklen pro Anfrage beansprucht, können Sie 240 Anfragen pro Sekunde und pro Instanz verarbeiten. Bei 100 Mega-Prozessorzyklen pro Anfrage werden 24 Anfragen pro Sekunde und pro Instanz erreicht. Diese Zahlen sind der Idealfall, aber in Bezug auf den erreichbaren Durchsatz auf einer Instanz recht realistisch.

Umgebungsvariablen

Folgende Umgebungsvariablen werden durch die Laufzeit festgelegt:

Umgebungsvariable Beschreibung
GAE_APPLICATION ID der App Engine-Anwendung. Diese ID hat das Präfix „region code~”, z. B. „e~” für Anwendungen, die in Europa bereitgestellt werden.
GAE_DEPLOYMENT_ID ID der aktuellen Bereitstellung.
GAE_ENV App Engine-Umgebung. Legen Sie standard fest.
GAE_INSTANCE ID der Instanz, auf der Ihr Dienst gerade ausgeführt wird.
GAE_RUNTIME Laufzeit, die in der Datei app.yaml angegeben ist.
GAE_SERVICE Dienstname, der in der Datei app.yaml angegeben ist. Wenn kein Dienstname angegeben ist, wird als Wert default festgelegt.
GAE_VERSION Aktuelle Versionsbezeichnung Ihres Dienstes.
GOOGLE_CLOUD_PROJECT Google Cloud-Projekt-ID, die der Anwendung zugeordnet ist.
PORT Port, der HTTP-Anfragen empfängt.

Sie können zusätzliche Umgebungsvariablen in Ihrer app.yaml-Datei definieren. Die oben genannten Werte können jedoch nicht überschrieben werden.