INTEGRITY Dokumentace

Python Workers API

Tento návod se věnuje Python Workflows SDK a vysvětluje, jak pomocí Pythonu vytvářet workflows.

WorkflowEntrypoint

WorkflowEntrypoint je hlavním vstupním bodem pro Python workflow. Rozšiřuje WorkflowEntrypoint třídu, a implementuje run metoda.

from workers import WorkflowEntrypoint

class MyWorkflow(WorkflowEntrypoint):
    async def run(self, event, step):
        # steps here

WorkflowStep

Závislosti se řeší implicitně podle názvu parametru. Pokud název parametru funkce kroku odpovídá dříve deklarované funkci kroku, do daného kroku se vloží její výsledek.

Pokud definujete ctx parametr, do daného argumentu se vloží kontext kroku.

from workers import WorkflowEntrypoint

class MyWorkflow(WorkflowEntrypoint):
    async def run(self, event, step):
        @step.do()
        async def my_first_step():
            # do some work
            return "Hello World!"

        await my_first_step()

Upozorňujeme, že dekorátor sám o sobě krok nevolá, pouze vrací volatelný objekt, kterým lze krok vyvolat. Aby se krok spustil, musíte tento volatelný objekt zavolat.

Při vrácení stavu z kroku musíte zajistit, aby byla vrácená hodnota serializovatelná.

async def run(self, event, step):
    await step.sleep("my-sleep-step", "10 seconds")
import datetime

async def run(self, event, step):
    await step.sleep_until("my-sleep-step", datetime.datetime.now() + datetime.timedelta(seconds=10))
async def run(self, event, step):
    await step.wait_for_event("my-wait-for-event-step", "my-event-type")

event parametr

event parametr je slovník, který obsahuje payload předaný instanci Workflow, spolu s dalšími metadaty:

Zpracování chyb

Sémantika Workflows umožňuje uživatelům zachytávat výjimky vyvolané až na nejvyšší úrovni.

Zachytávání konkrétních výjimek uvnitř except blok nemusí fungovat, protože některé chyby Pythonu nebudou při průchodu vrstvou RPC znovu vytvořeny jako stejný typ chyby.

async def run(self, event, step):
    async def try_step(fn):
        try:
            return await fn()
        except Exception as e:
            print(f"Successfully caught {type(e).__name__}: {e}")

    @step.do("my_failing")
    async def my_failing():
        print("Executing my_failing")
        raise TypeError("Intentional error in my_failing")

    await try_step(my_failing)

NonRetryableError

Python Workflows SDK poskytuje NonRetryableError třída, kterou lze použít k signalizaci, že se krok nemá opakovat.

from workers.workflows import NonRetryableError

raise NonRetryableError(message)

Konfigurace instance workflow

Krok můžete svázat s konkrétní zásadou opakování předáním WorkflowStepConfig objekt do config parametru step.do dekorátor. U Python Workflows musíte zajistit, aby váš dict respektuje WorkflowStepConfig typ.

from workers import WorkflowEntrypoint

class DemoWorkflowClass(WorkflowEntrypoint):
    async def run(self, event, step):
        @step.do('step-name', config={"retries": {"limit": 1, "delay": "10 seconds"}})
        async def first_step():
            # do some work
            pass

Přístup ke kontextu kroku (ctx)

Pokud definujete ctx parametr, kontext kroku je vloženo do tohoto argumentu. Kontext je slovník s následujícími klíči:

Key Typ Popis
step dict Obsahuje name (název kroku) a count (kolikrát step.do byla zavolána s tímto názvem).
attempt int Číslo aktuálního pokusu (číslováno od 1).
config dict Výsledná konfigurace opakování a časového limitu pro tento krok.
from workers import WorkflowEntrypoint

class CtxWorkflow(WorkflowEntrypoint):
    async def run(self, event, step):
        @step.do()
        async def read_context(ctx):
            print(ctx["step"]["name"])    # step name
            print(ctx["step"]["count"])   # step count
            print(ctx["attempt"])         # attempt number
            print(ctx["config"])          # resolved step config
            return ctx["attempt"]

        return await read_context()

Vytvoření instance přes binding

Upozorňujeme, že env je JavaScript objekt, který je Python skriptu vystaven přes JsProxy ↗. K vazbě můžete přistupovat stejně jako u JavaScript Workeru. Podívejte se na Dokumentace k vazbě na Workflow kde se dozvíte více o dostupných metodách.

Uvažujme předchozí binding s názvem MY_WORKFLOW. Takto byste vytvořili novou instanci:

from workers import Response, WorkerEntrypoint

class Default(WorkerEntrypoint):
    async def fetch(self, request):
        instance = await self.env.MY_WORKFLOW.create()
        return Response.json({"status": "success"})