Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Använd Durable Functions, en funktion i Azure Functions, för att skriva tillståndskänsliga serverlösa arbetsflöden i Python. I den här snabbstarten ska du klona och köra en exempelapp som visar två vanliga orkestreringsmönster:
- Funktionskedjning: Anropar aktiviteter i följd (Tokyo → Seattle → London).
- Fan-out/fan-in: Anropar aktiviteter parallellt i fem städer och sammanställer sedan resultatet.
När du är klar kommer båda orkestreringarna att köras lokalt med Durable Task Scheduler-emulatorn, och du kan se deras status på instrumentpanelen.
- Klona och förbered Hello Cities-exempelprojektet.
- Konfigurera Durable Task Scheduler-emulatorn och Azurite för lokal utveckling.
- Kör funktionsappen och utlös båda orkestreringarna.
- Granska orkestreringsstatus och utdata i instrumentpanelen för Durable Task Scheduler.
Förutsättningar
- Python 3.9+ är installerat.
- Azure Functions Core Tools v4 eller senare.
- Docker för att köra emulatorn och Azurite.
- Klona Durable Task Scheduler GitHub-lagringsplatsen för att använda snabbstartsexemplet.
Konfigurera Durable Task Scheduler-emulatorn
Durable Task Scheduler-emulatorn tillhandahåller en lokal utvecklingsmiljö så att du kan testa orkestreringar utan en Azure prenumeration. Värden för Functions kräver också Azurite för lokal lagring.
Starta båda containrarna:
docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
mcr.microsoft.com/dts/dts-emulator:latest
docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
mcr.microsoft.com/azure-storage/azurite
Tip
När emulatorn körs kan du komma åt instrumentpanelen Durable Task Scheduler på http://localhost:8082 för att övervaka orkestreringar.
Kör snabbstartsexemplet
Gå till exempelkatalogen Hello Cities:
cd samples/durable-functions/python/hello-citiesSkapa en virtuell miljö och installera beroenden:
python -m venv .venv .venv\Scripts\activate pip install -r requirements.txtKontrollera att
local.settings.jsonfilen innehåller följande konfiguration:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python", "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None" } }Starta funktionsappen:
func startI ett separat terminalfönster startar du orkestreringen för funktionskedjning:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining $responseSvaret innehåller status-URL:er för orkestreringsinstansen. Kopiera värdet
statusQueryGetUrioch kör det för att kontrollera resultatet:Invoke-RestMethod -Uri $response.statusQueryGetUriUtlös fan-out/fan-in-orkestreringen :
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn Invoke-RestMethod -Uri $response.statusQueryGetUri
Förväntade utdata
POST-begäran returnerar ett JSON-svar med status-URL:er. Ett exempel:
{
"id": "<instanceId>",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
"sendEventPostUri": "...",
"terminatePostUri": "...",
"purgeHistoryDeleteUri": "..."
}
När du frågar efter statusQueryGetUri och orkestreringens runtimeStatus är Completed, kan du hitta hälsningsresultaten i fältet output. Länkningsorkestreringen returnerar:
{
"name": "chaining_orchestration",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}
Fan-out/fan-in-orkestreringen returnerar följande:
{
"name": "fan_out_fan_in_orchestration",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}
Tip
Om runtimeStatus visar Running eller Pendingväntar du en stund och frågar statusQueryGetUri igen.
Öppna instrumentpanelen för Durable Task Scheduler på http://localhost:8082 om du vill visa orkestreringsstatus och körningshistorik.
Förstå koden
Exemplet använder programmeringsmodellen Python v2 med dekoratörer, där alla funktioner definieras i en enda fil (function_app.py).
Aktivitetsfunktion
Aktiviteten say_hello tar ett stadsnamn och returnerar en hälsning:
@app.activity_trigger(input_name="city")
def say_hello(city: str) -> str:
"""Activity function that returns a greeting for a city."""
logging.info(f"Saying hello to {city}.")
return f"Hello {city}!"
Orkestratorfunktioner
Den sammanlänkande orkestratorn anropar say_hello sekventiellt för tre städer:
@app.orchestration_trigger(context_name="context")
def chaining_orchestration(context: df.DurableOrchestrationContext):
"""Function chaining orchestration: calls activities sequentially."""
result1 = yield context.call_activity("say_hello", "Tokyo")
result2 = yield context.call_activity("say_hello", "Seattle")
result3 = yield context.call_activity("say_hello", "London")
return [result1, result2, result3]
Fan-out/fan-in orchestrator schemalägger aktiviteter parallellt:
@app.orchestration_trigger(context_name="context")
def fan_out_fan_in_orchestration(context: df.DurableOrchestrationContext):
"""Fan-out/Fan-in orchestration: calls activities in parallel."""
cities = ["Tokyo", "Seattle", "London", "Paris", "Berlin"]
# Fan-out: schedule all activities in parallel
parallel_tasks = []
for city in cities:
task = context.call_activity("say_hello", city)
parallel_tasks.append(task)
# Fan-in: wait for all to complete
results = yield context.task_all(parallel_tasks)
return results
Klientfunktioner
Klientfunktioner som utlöses via HTTP startar varje orkestrering. Till exempel start för kedjning:
@app.route(route="StartChaining", methods=["POST"])
@app.durable_client_input(client_name="client")
async def start_chaining(req: func.HttpRequest, client) -> func.HttpResponse:
"""HTTP trigger to start the function chaining orchestration."""
instance_id = await client.start_new("chaining_orchestration")
logging.info(f"Started chaining orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
Konfiguration
Exemplet använder Durable Task Scheduler-emulatorn som lagringsbackend. Detta konfigureras i host.json:
{
"version": "2.0",
"logging": {
"logLevel": {
"DurableTask.Core": "Warning"
}
},
"extensions": {
"durableTask": {
"hubName": "default",
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
Rensa resurser
Stoppa emulatorcontainrarna när du är klar:
docker stop dtsemulator azurite && docker rm dtsemulator azurite
Så här inaktiverar du den Python virtuella miljön:
deactivate
Nästa steg
- Läs mer om vanliga Durable Functions applikationsmönster.
- Lär dig mer om Durable Functions lagringsproviders.