Anscheinend wurden Pythons dauerhafte Funktionen am 24. Juni 2020 zu einer öffentlichen Vorschau ...
Durable Functions now supports Python
Also habe ich es schnell vor Ort versucht.
Dokumentation und GitHub Basierend auf -durable-python) haben wir die folgende Verifizierungsumgebung vorbereitet.
Erstellen Sie ein Projekt mit der Erweiterung Azure-Funktionen. Befolgen Sie die Anweisungen zur Erweiterung, um ein Python-Funktionsprojekt zu erstellen.
Öffnen Sie "require.txt" des erstellten Projekts und fügen Sie das Modul "azure-functions-durable> = 1.0.0b6" für dauerhafte Funktionen hinzu.
Öffnen Sie ein VS Code-Terminal und aktivieren Sie die in Ihrem Projekt erstellte virtuelle Python-Umgebung. Installieren Sie das Modul mit "require.txt" in der virtuellen Python-Umgebung.
> .\.venv\Scripts\activate
> python -m pip install -r requirements.txt
Erstellen Sie nach dem Erstellen des Projekts die Funktionen Orchestrator, Activity und Client. Dokumentation soll die Vorlage für dauerhafte Funktionen verwenden, aber im Moment Da es keine Vorlage gibt, erstellen Sie sie mit der Vorlage "Http Trigger" und schreiben Sie den Inhalt von "\ _init \ _. Py" und "functions.json" neu.
Erstellen Sie eine Funktion "Dauerhafte Aktivität" mit der Vorlage "HTTP-Trigger" und schreiben Sie "\ _init \ _. Py" und "functions.json" mit den folgenden Inhalten neu. Der Inhalt ist so einfach wie die Rückgabe des an die Funktion übergebenen Werts mit "Hallo" am Anfang. Um das Verständnis des Ausführungsstatus der Funktion zu erleichtern, warten wir 2 Sekunden auf den Vorgang, damit "Aktivität {Name}" im Protokoll angezeigt wird.
_init_.py
import logging
import time
def main(name: str) -> str:
time.sleep(2)
logging.warning(f"Activity {name}")
return f'Hello {name}!'
functions.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "name",
"type": "activityTrigger",
"direction": "in",
"datatype": "string"
}
],
"disabled": false
}
Erstellen Sie eine "Durable-Orchestrator" -Funktion mit der Vorlage "Http Trigger" und schreiben Sie "\ _init \ _. Py" und "functions.json" mit den folgenden Inhalten neu. Die Werte von "Tokyo", "Seattle" und "London" werden an die zuvor erstellte Aktivitätsfunktion übergeben und die Ergebnisse in einem Array gespeichert. Mit jedem Aufruf ist eine Rendite verbunden, um als Funktionskette zu fungieren. Die Methode zum Aufrufen der Aktivitätsfunktion ist dieselbe wie bei JavaScript, solange die Funktion zu einem Schlangenfall wird.
_init_.py
import azure.durable_functions as df
def orchestrator_function(context: df.DurableOrchestrationContext):
#Rufen Sie die Aktivitätsfunktion auf
task1 = yield context.call_activity("durable-activity", "Tokyo")
task2 = yield context.call_activity("durable-activity", "Seattle")
task3 = yield context.call_activity("durable-activity", "London")
outputs = [task1, task2, task3]
return outputs
main = df.Orchestrator.create(orchestrator_function)
functions.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "context",
"type": "orchestrationTrigger",
"direction": "in"
}
],
"disabled": false
}
Erstellen Sie eine "Durable-Client" -Funktion mit der Vorlage "Http Trigger" und schreiben Sie "\ _init \ _. Py" und "functions.json" mit den folgenden Inhalten neu. Der Aufruf erfolgt durch Angabe der Orchestrator-Funktion in "client.start_new". Die aufrufende Methode ist dieselbe wie JavaScript, der Bindungstyp ist jedoch in JavaScript "durableClient", unterscheidet sich jedoch auch von "orchestrationClient".
_init_.py
import logging
from azure.durable_functions import DurableOrchestrationClient
import azure.functions as func
async def main(req: func.HttpRequest, starter: str, message):
logging.info(starter)
client = DurableOrchestrationClient(starter)
#Start von Orchestrator
instance_id = await client.start_new('durable-orchestrator')
response = client.create_check_status_response(req, instance_id)
message.set(response)
functions.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"methods": [
"post",
"get"
]
},
{
"direction": "out",
"name": "message",
"type": "http"
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": "in",
"datatype": "string"
}
]
}
Nachdem die Funktion erstellt wurde, führen wir sie lokal aus. Für dauerhafte Funktionen ist Azure Storage aufgrund seines Mechanismus erforderlich. Wenn Sie es also lokal ausführen möchten, verwenden Sie Azure Storage Emulator. Wenn Sie Emulator verwenden möchten, öffnen Sie "local.settings.json" im Stammverzeichnis des Projekts, weisen Sie "AzureWebJobsStorage" "UseDevelopmentStorage = true" zu und starten Sie Azure Storage Emulator.
json:local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python"
}
}
Drücken Sie F5, um den Debug-Modus aufzurufen. Wenn der Prozess gestartet wird, wird die URL der Client-Funktion angezeigt. Greifen Sie daher mit einem Client wie Postman darauf zu.
Wenn Sie mit Postman eine Get-Anfrage stellen, fließt das Protokoll zum Terminal und die Statusverwaltungs-URL wird als Antwort zurückgegeben.
Wenn Sie das angezeigte Protokoll überprüfen, sehen Sie, dass die gelben Warnbuchstaben ungefähr alle 2 Sekunden in der Reihenfolge "Aktivität Tokio", "Aktivität Seattle", "Aktivität London" angezeigt werden. Sie können sehen, dass die Funktionskette ordnungsgemäß funktioniert.
Als ich den Status von Orchestrator mit "statusQueryGetUri" in der Antwort überprüfte, war der runtimeStatus "Completed" und ein Array von "Hello Tokyo!", "Hello Seattle!" Und "Hello London!" Wurde als Ausgabe erhalten.
Fan-Out/Fan-In Ich werde auch Fan-Out / Fan-In ausprobieren, weil es eine große Sache ist. Schreiben Sie die Orchestrator-Funktion wie folgt um.
_init_.py
import azure.durable_functions as df
def orchestrator_function(context: df.DurableOrchestrationContext):
#Rufen Sie die Aktivitätsfunktion auf
# task1 = yield context.call_activity("durable-activity", "Tokyo")
# task2 = yield context.call_activity("durable-activity", "Seattle")
# task3 = yield context.call_activity("durable-activity", "London")
# outputs = [task1, task2, task3]
tasks = []
tasks.append(context.call_activity("durable-activity", "Tokyo"))
tasks.append(context.call_activity("durable-activity", "Seattle"))
tasks.append(context.call_activity("durable-activity", "London"))
outputs = yield context.task_all(tasks)
return outputs
main = df.Orchestrator.create(orchestrator_function)
Ich habe versucht, das umgeschriebene auszuführen. In der Reihenfolge "Tokio", "Seattle" und "London" registrierte Aufgaben wurden in zufälliger Reihenfolge als "Seattle", "London" und "Tokio" verarbeitet. Jeder Prozess fand jedoch alle 2 Sekunden statt, und es schien nicht die für Fan-Out / Fan-In erwartete Parallelverarbeitung zu sein. Es befindet sich noch in der Vorschau, daher erwarte ich es für die Zukunft.
Obwohl es sich um eine Python-Version handelt, handelt es sich um dauerhafte Funktionen. Die Skriptmethode ist also dieselbe wie bei JavaScript, und es scheint, dass Sie problemlos entwickeln können, wenn Sie über Entwicklungserfahrung mit JavaScript verfügen. Wie in Release beschrieben, ist im Fall von Python die Richtung des maschinellen Lernens und der Datenanalyse Als Nutzungsmethode scheint es interessant zu sein, dass ein neues Szenario wie das Erstellen einer Parallelverarbeitungsumgebung für Daten ohne Server möglich geworden ist.
Recommended Posts