Apparemment, les fonctions durables de Python sont devenues une avant-première publique le 24 juin 2020 ...
Durable Functions now supports Python
Donc, je l'ai rapidement essayé localement.
Documentation et GitHub Basé sur -durable-python), nous avons préparé l'environnement de vérification suivant.
Créez un projet à l'aide de l'extension Azure Functions. Suivez les invites d'extension pour créer un projet de fonction Python.
Ouvrez "requirements.txt" du projet créé et ajoutez le module "azure-functions-durable> = 1.0.0b6" pour les fonctions durables.
Ouvrez un terminal VS Code et activez l'environnement virtuel Python créé dans votre projet. Installez le module avec "requirements.txt" dans l'environnement virtuel Python.
> .\.venv\Scripts\activate
> python -m pip install -r requirements.txt
Une fois le projet créé, créez respectivement les fonctions Orchestrator, Activity et Client. Documentation est censé utiliser le modèle pour Durable Functions, mais pour le moment Puisqu'il n'y a pas de modèle, créez-le avec le modèle de "Http Trigger" et réécrivez le contenu de "\ _init \ _. Py" et "functions.json".
Créez une fonction "activité durable" avec le modèle "Http Trigger" et réécrivez "\ _init \ _. Py" et "functions.json" avec le contenu suivant. Le contenu est aussi simple que de renvoyer la valeur passée à la fonction avec "Hello" au début. Afin de faciliter la compréhension de l'état d'exécution de la fonction, nous attendons 2 secondes le processus pour que "Activity {name}" s'affiche dans le journal.
_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
}
Créez une fonction "durable-orchestrator" avec le modèle "Http Trigger" et réécrivez "\ _init \ _. Py" et "functions.json" avec le contenu suivant. Les valeurs de «Tokyo», «Seattle» et «Londres» sont transmises à la fonction Activity créée précédemment et les résultats sont stockés dans un tableau. Le rendement est attaché à chaque appel pour fonctionner comme une chaîne de fonctions. La méthode d'appel de la fonction Activity est la même que JavaScript, tant que la fonction devient un cas de serpent.
_init_.py
import azure.durable_functions as df
def orchestrator_function(context: df.DurableOrchestrationContext):
#Appelez la fonction Activité
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
}
Créez une fonction «client durable» avec le modèle «Http Trigger» et réécrivez «\ _init \ _. Py» et «functions.json» avec le contenu suivant. L'appel est effectué en spécifiant la fonction Orchestrator dans "client.start_new". La méthode d'appel est la même que JavaScript, mais le type de liaison est "durableClient" en JavaScript, mais il est également différent de "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)
#Début d'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"
}
]
}
Maintenant que la fonction a été créée, exécutons-la localement. Les fonctions durables nécessitent le stockage Azure en raison de son mécanisme, donc si vous souhaitez l'exécuter localement, utilisez l'émulateur de stockage Azure. Si vous souhaitez utiliser Emulator, ouvrez "local.settings.json" à la racine du projet, affectez "UseDevelopmentStorage = true" à "AzureWebJobsStorage" et démarrez Azure Storage Emulator.
json:local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python"
}
}
Appuyez sur F5 pour entrer en mode débogage. Lorsque le processus démarre, l'URL de la fonction Client s'affiche, alors accédez-y avec un client tel que Postman.
Lorsque vous effectuez une demande Get avec Postman, le journal commence à circuler vers le terminal et l'URL de gestion de l'état est renvoyée en tant que réponse.
Si vous vérifiez le journal affiché, vous pouvez voir que les lettres jaunes d'avertissement sont affichées dans l'ordre «Activity Tokyo», «Activity Seattle», «Activity London» environ toutes les 2 secondes. Vous pouvez voir que la chaîne de fonctions fonctionne correctement.
Quand j'ai vérifié l'état d'Orchestrator avec "statusQueryGetUri" dans la réponse, le runtimeStatus était "Completed", et les sorties étaient "Hello Tokyo!", "Hello Seattle!", Et "Hello London!".
Fan-Out/Fan-In J'essaierai aussi Fan-Out / Fan-In car c'est un gros problème. Réécrivez la fonction Orchestrator comme suit.
_init_.py
import azure.durable_functions as df
def orchestrator_function(context: df.DurableOrchestrationContext):
#Appelez la fonction Activité
# 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)
J'ai essayé d'exécuter celui réécrit. Les tâches enregistrées dans l'ordre «Tokyo», «Seattle» et «Londres» ont été traitées dans un ordre aléatoire comme «Seattle», «Londres» et «Tokyo». Cependant, chaque processus se produisait toutes les 2 secondes, et il ne semblait pas être le traitement parallèle attendu pour Fan-Out / Fan-In. Il est toujours en phase de prévisualisation, donc je m'attends à ce qu'il soit dans le futur.
Bien qu'il s'agisse d'une version Python, il s'agit de fonctions durables, donc la méthode de script est la même que JavaScript, et il semble que vous puissiez développer sans difficulté si vous avez de l'expérience en développement avec JavaScript. Comme décrit dans Release, dans le cas de Python, la direction de l'apprentissage automatique et de l'analyse des données Il semble intéressant comme méthode d'utilisation qu'un nouveau scénario tel que la construction d'un environnement de traitement parallèle de données sans serveur soit devenu possible.
Recommended Posts