Fonctionnalités de persistance Azure : listes de traitement

王林
Libérer: 2024-02-22 12:25:10
avant
889 Les gens l'ont consulté

Fonctionnalités de persistance Azure : listes de traitement

Contenu de la question

J'ai une fonction persistante Azure écrite en python avec un coordinateur et deux fonctions actives

orchestrator appelle la première fonction active et reçoit en retour une liste de variables (la liste des noms et cette liste peuvent être dynamiques à chaque exécution de la fonction)

L'étape suivante consiste à appeler la deuxième fonction d'activité pour chaque élément de la liste (traitement séquentiel - en raison des limitations de l'API du deuxième appel de fonction d'activité)

#dynamically gets generated by the first activity function
payload=[1,2,3,4]            

tasks = [context.call_activity("secondfunction",ps) for ps in payload]
output = yield context.task_all(tasks)
Copier après la connexion

J'utilise autre chose que la série dans la méthode de diffusion, mais je n'arrive pas à trouver une alternative à ce que j'essaie de faire.

De plus, dans le fichier host.json, j'ai essayé de forcer qu'une seule fonction active puisse s'exécuter à un instant donné pour éviter un traitement parallèle

"extensions": {
    "durableTask": {
      "maxConcurrentActivityFunctions": 1,
      "maxConcurrentOrchestratorFunctions": 1
    }
  }
Copier après la connexion

Il convient également de noter que je ne peux pas transmettre la liste entière à la fonction d'activité, car si j'exécute la fonction d'activité, cela prendra plus de 5 à 10 minutes, ce qui est le délai d'attente pour les fonctions Azure, donc essayez de parcourir la fonction d'orchestration de liste

Mais les résultats ne sont pas continus

Merci beaucoup pour vos commentaires


Réponse correcte


Vous pouvez essayer d'utiliser les deux méthodes suivantes pour répondre à vos exigences :-

Méthode 1 :-

Mon function_app.py :-

import azure.functions as func
import azure.durable_functions as df

myapp = df.dfapp(http_auth_level=func.authlevel.anonymous)

# http starter
@myapp.route(route="orchestrators/{functionname}")
@myapp.durable_client_input(client_name="client")
async def http_start(req: func.httprequest, client):
    function_name = req.route_params.get('functionname')
    instance_id = await client.start_new(function_name, none)  # pass the functionname here
    response = client.create_check_status_response(req, instance_id)
    return response

# orchestrator
@myapp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
    cities = ["seattle", "tokyo", "london"]

    tasks = []
    for city in cities:
        tasks.append(context.call_activity("hello", city))

    # wait for all tasks to complete
    results = yield context.task_all(tasks)

    return results

# activity
@myapp.activity_trigger(input_name="city")
def hello(city: str):
    print(f"processing {city}...")
    # your activity function logic goes here
    result = f"hello {city}!"

    return result

Copier après la connexion

Sortie :-

url de la fonction :-

http://localhost:7071/api/orchestrators/hello_orchestrator
Copier après la connexion

Méthode 2 :-

function_app.py :-

import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

# HTTP Starter
@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
    function_name = req.route_params.get('functionName')
    instance_id = await client.start_new(function_name, None)  # Pass the functionName here
    response = client.create_check_status_response(req, instance_id)
    return response

# Orchestrator
@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
    # Call the first activity to get a list of names
    names_list = yield context.call_activity("get_names")

    # Process each name sequentially using the second activity
    results = []
    for name in names_list:
        result = yield context.call_activity("process_name", name)
        results.append(result)

    return results

# First Activity
@myApp.activity_trigger
def get_names():
    # Your logic to retrieve a dynamic list of names goes here
    # For demonstration purposes, returning a hardcoded list
    return ["John", "Alice", "Bob"]

# Second Activity
@myApp.activity_trigger(input_name="name")
def process_name(name: str):
    print(f"Processing {name}...")
    # Your logic to process each name goes here
    result = f"Hello {name}!"

    return result
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!