Azure Functions: essayez des fonctions durables pour Python

introduction

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.

Environnement de vérification

Documentation et GitHub Basé sur -durable-python), nous avons préparé l'environnement de vérification suivant.

Créer un projet

Créez un projet à l'aide de l'extension Azure Functions. Suivez les invites d'extension pour créer un projet de fonction Python. image.png

Ouvrez "requirements.txt" du projet créé et ajoutez le module "azure-functions-durable> = 1.0.0b6" pour les fonctions durables. image.png

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

image.png

Créer une fonction

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".

image.png

Fonction d'activité

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
}

Fonction orchestrateur

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
}

Fonction client

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"
    }
  ]
}

Exécution locale des fonctions

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"
  }
}

image.png

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. image.png

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. image.png

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. image.png

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!". image.png

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. image.png

Résumé

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.

référence

Recommended Posts

Azure Functions: essayez des fonctions durables pour Python
[Azure] Essayez d'utiliser Azure Functions
Arguments de mots-clés pour les fonctions Python
Python #function 1 pour les super débutants
Essayez Python
Fonctions Python
Essayez d'utiliser Python avec Google Cloud Functions
Utiliser Python et MeCab avec Azure Functions
[Pour les débutants] Essayez le web scraping avec Python
30/10/2016 else pour Python3> pour:
python [pour moi]
Python> essayez: / sauf:
# Bases de Python (fonctions)
[Débutant] Fonctions Python
Fonctions Python faciles à utiliser
bases de python: fonctions
VS Code + Azure Functions + Procédure de construction de l'environnement Python
Essayez de calculer RPN avec Python (pour les débutants)
[Azure Functions / Python] Fonctions de chaîne avec liaison de stockage de file d'attente
Astro: modules / fonctions python fréquemment utilisés pour l'analyse
À propos de Python for loop
Guide du débutant Python (fonctions)
Cours de base Python (12 fonctions)
[Python of Hikari-] Chapitre 06-04 Fonctions (arguments et valeurs de retour 3)
Bases de Python ② pour déclaration
python essayez ~ sauf ~ autre
[Python] Mémo sur les fonctions
Essayez de rechercher un profil d'un million de caractères en Python
À propos de Python, pour ~ (plage)
Manuel python pour les débutants
Essayez Debian + Python 3.4 + django1.7 ……
Refactoring des outils utilisables avec Python
Essayez gRPC en Python
Toolchain pour Python pour Android
[Hikari-Python] Chapitre 06-01 Fonctions (fonctions intégrées et définitions de fonctions)
# 4 [python] Bases des fonctions
Mémo d'entrée / sortie de stockage par Python dans Azure Functions
Fonction intégrée Python ~ Zip ~
Essayez 9 tranches en Python
[Python of Hikari-] Chapitre 06-03 Fonctions (arguments et valeurs de retour 2)
Fonctions intégrées Wrap Python
Essayez d'utiliser Tweepy [Python2.7]
OpenCV pour les débutants en Python
Python essayer / sauf mémo
Installez Python (pour Windows)
[Python] pour une erreur d'instruction
Maintenance de l'environnement Python pour les projets
Essayez d'afficher diverses informations utiles pour le débogage avec python
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
Comment spécifier Cache-Control pour le stockage BLOB dans le stockage Azure en Python
[Hikari-Python] <Supplement> Chapitre 06-05 Fonctions (arguments et valeurs de retour 4)
Curry n'importe quelle fonction avec Python ...
Python> lambda> petites fonctions / fonctions de rappel
Introduction aux fonctions Python
Mémo Python (pour moi): Array
Prise en charge de Fabric pour Python 3