Maison  >  Article  >  développement back-end  >  Fonctionnalités de persistance Azure : listes de traitement

Fonctionnalités de persistance Azure : listes de traitement

王林
王林avant
2024-02-22 12:25:10915parcourir

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)

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

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

Sortie :-

url de la fonction :-

http://localhost:7071/api/orchestrators/hello_orchestrator

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer