Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Munkafolyamat .NET-ben való futtatásakor a végrehajtási mód vezérli a szuperlépések feldolgozását és az események fogyasztóhoz való eljuttatását. Az InProcessExecution osztály két végrehajtási módot tesz elérhetővé: OffThread és Lockstep.
Overview
| OffThread (alapértelmezett) | Zárolás | |
|---|---|---|
| Superstep-végrehajtás | Háttérszál | Fogyasztói szál |
| Eseménykézbesítés | Azonnali, ahogy az események felmerülnek | Minden szupersztep befejezése után kötegelve |
| Lépés végrehajtása | Eseményfeldolgozástól függetlenül | Szüneteltetve, amíg a köteges események feldolgozásra kerülnek |
| Konkurencia | A fogyasztó felolvassa az eseményeket, miközben a szupersteps fut | A fogyasztó és a szuperlépés-végrehajtás váltakozik |
| A legjobb ehhez: | Valós idejű streamelés, éles forgatókönyvek | Tesztelés, hibakeresés, determinisztikus rendezés |
OffThread
Az OffThread az alapértelmezett végrehajtási mód. A Supersteps egy háttérszálon fut, és az eseményeket azonnal továbbítják, amint azok a csatornaalapú implementáción keresztül létrejönnek.
// OffThread is the default — these are equivalent:
await using StreamingRun run = await InProcessExecution.RunStreamingAsync(workflow, input);
await using StreamingRun run = await InProcessExecution.OffThread.RunStreamingAsync(workflow, input);
Hogyan működik?
- A háttérfeladat folyamatosan futtat szupersztepseket, amíg az üzenetek függőben vannak.
- Mivel a végrehajtók kimeneteket vagy eseményeket hoznak létre, az eredményül kapott
WorkflowEventobjektumokat egy kötetlenChannel<WorkflowEvent>-be írják. - A kliens az eseményeket a csatornán keresztül olvassa be
WatchStreamAsync, és valós időben fogadja őket, ahogy keletkeznek. - Ha az összes szuperlépés befejeződött, és nem marad üzenet, a futtatás leáll egy
IdlevagyPendingRequestsállapottal.
Mivel a superstep ciklus és a fogyasztó egyidejűleg fut, az események azonnal megjelennek, amint azok felmerülnek – nincs pufferelési késleltetés. Ez ideálissá teszi az OffThreadot olyan streamelési forgatókönyvekhez, ahol az alacsony késésű eseménykézbesítés számít, például jogkivonatonkénti frissítések megjelenítése a felhasználói felületen.
Egyidejű futtatások
Az OffThread egy egyidejű változatot is támogat, amely lehetővé teszi, hogy egyszerre több futtatás is ugyanazt a munkafolyamat-példányt ossza meg:
await using StreamingRun run = await InProcessExecution.Concurrent.RunStreamingAsync(workflow, input);
Important
Az egyidejű végrehajtáshoz a munkafolyamat összes végrehajtóját deklarálni crossRunShareable kell (a konstruktoron), vagy gyári metódusként kell megadni.
Zárolás
Lockstep módban a szuperlépések a fogyasztó szálában futnak, nem pedig egy háttérfeladaton. Az események minden szupersztep során halmozódnak fel, és a szupersztep befejeződése után kötegként bocsátják ki.
await using StreamingRun run = await InProcessExecution.Lockstep.RunStreamingAsync(workflow, input);
Hogyan működik?
- A fogyasztó meghívja
WatchStreamAsynca végrehajtási ciklust. - A superstep a befejezésig fut, és az események egy várólistában halmozódnak fel.
- A szuperstep befejezése után az összes várólistán lévő eseményt a rendszer a fogyasztónak adja.
- A következő szuperlépés csak azután kezdődik, hogy a fogyasztó megkapta az összes eseményt az előző lépésből.
Ez a váltakozó minta azt jelenti, hogy a fogyasztó és a munkafolyamat-motor soha nem fut egyszerre. Az eseménykézbesítés determinisztikus – a szuperstep összes eseménye garantáltan a következő szupersztep eseményei előtt érkezik.
Mikor érdemes használni a Lockstep-et?
A Lockstep akkor hasznos, ha:
- Tesztelés – a determinisztikus eseményrendezés egyértelművé teszi az állításokat.
- Hibakeresés – a lépésről lépésre hibakeresés egyszerűbb, ha a végrehajtás a fogyasztó szálán marad.
- Rendezett feldolgozás – olyan forgatókönyvek, ahol egy szuperstep eseményének teljes feldolgozására van szükség a következő szuperstep kezdete előtt.
Végrehajtási mód kiválasztása
Az alapértelmezett OffThread módot a legtöbb éles forgatókönyv esetében ajánljuk. Ez biztosítja a legjobb válaszkészséget, és lehetővé teszi a munkafolyamat számára a feldolgozás folytatását, miközben a fogyasztó kezeli az eseményeket.
Akkor használja a Lockstepet, ha a determinisztikus viselkedés fontosabb a teljesítménynél, például egységtesztekben vagy hibakeresési munkamenetekben.
// Production: OffThread (default)
await using StreamingRun run = await InProcessExecution.RunStreamingAsync(workflow, input);
// Testing: Lockstep for deterministic behavior
await using StreamingRun run = await InProcessExecution.Lockstep.RunStreamingAsync(workflow, input);
Nem-streamelő végrehajtás
Mindkét végrehajtási mód támogatja a nem streamelő végrehajtás-t a RunAsync által. Nem streamelési módban a munkafolyamat a befejezésig fut, és az összes eseményt egy Run objektumba gyűjti ahelyett, hogy növekményesen streameli őket:
Run run = await InProcessExecution.RunAsync(workflow, input);
// Access all emitted events
foreach (WorkflowEvent evt in run.OutgoingEvents)
{
// Process events
}
Mivel a nem streamelt végrehajtás az összes eseményt összegyűjti a befejezés után, az OffThread valós idejű eseménykézbesítési előnye nem érvényes. A nem streamelési forgatókönyvekben a módok közötti elsődleges különbség a szálkezelés: az OffThread szuperstepseket futtat egy háttérszálon, felszabadítva a hívó szálat a befejezésre várva, míg a Lockstep szupersteps-eket futtat a hívó szálán, és blokkolja azt, amíg a munkafolyamat befejeződik.
A nem streameléses végrehajtás az alapértelmezett OffThread módot használja. A Lockstep használata nem streameléses végrehajtással:
Run run = await InProcessExecution.Lockstep.RunAsync(workflow, input);
Következő lépések
A végrehajtási módok nem alkalmazhatók a Python-munkafolyamatokra. A Python-munkafolyamatok egyetlen végrehajtási modellt használnak, amely egy aszinkron generátoron keresztül kezeli a szupersztep-feldolgozást és az eseménykézbesítést. Ez a modell hasonló a .NET Lockstep üzemmódhoz – a lépések nem lépnek előre, csak akkor, ha a fogyasztó aktívan lekéri az eseményeket a generátorból.
A Python-munkafolyamatok futtatásával kapcsolatos információkért tekintse meg a Workflow Builder > Végrehajtás című témakört.
Munkafolyamat Go-ban való futtatásakor a végrehajtási környezet szabályozza a szuperstepsek feldolgozását és az események fogyasztónak való kézbesítését. A workflow/inproc csomag három környezetet tesz elérhetővé: Default/OffThread, Lockstepés .Concurrent
Overview
| OffThread /Default | Zárolás | Egyidejű | |
|---|---|---|---|
| Superstep-végrehajtás | Háttér goroutine | Az eseményfogyasztó által vezérelt | Háttér goroutine |
| Eseménykézbesítés | Azonnali, ahogy az események felmerülnek | Kötegelve az adatfolyam feldolgozása közben | Azonnali, ahogy az események felmerülnek |
| A legjobb ehhez: | Valós idejű streamelés, éles forgatókönyvek | Tesztelés, hibakeresés, determinisztikus rendezés | Megosztott munkafolyamat-példányok egyidejűleg biztonságos kötésekkel |
OffThread
Az OffThread az alapértelmezett végrehajtási mód. Ezek egyenértékűek:
stream, err := inproc.Default.RunStreaming(ctx, wf, input)
stream, err := inproc.OffThread.RunStreaming(ctx, wf, input)
Hogyan működik?
- A háttérben futó goroutine szuperlépéseket hajt végre, amíg vannak függőben lévő üzenetek.
- Mivel a végrehajtók kimeneteket vagy eseményeket hoznak létre, a munkafolyamat-események a streambe lesznek írva.
- A fogyasztó a
WatchStreamhasználatával olvassa az eseményeket, és azok előállításával egyidejűleg kapja meg őket. - Amikor az összes szuperlépés befejeződik, és nem maradnak üzenetek, a futás tétlen vagy függő kérelem állapotban leáll.
Egyidejű futtatások
Akkor használható inproc.Concurrent , ha a munkafolyamat összes végrehajtó kötése támogatja az egyidejű közös végrehajtást:
stream, err := inproc.Concurrent.RunStreaming(ctx, wf, input)
if err != nil {
return err
}
defer stream.Close(ctx)
Zárolás
Lockstep módban a munkafolyamat végrehajtása a fogyasztó streamből történő olvasásával összhangban halad előre. Ez determinisztikussá teszi az eseményrendezést a tesztekhez és a hibakereséshez.
stream, err := inproc.Lockstep.RunStreaming(ctx, wf, input)
if err != nil {
return err
}
defer stream.Close(ctx)
for evt, err := range stream.WatchStream(ctx) {
if err != nil {
return err
}
// inspect event
}
Hogyan működik?
- A fogyasztó meghívja
WatchStreama végrehajtási ciklust. - Egy szuperstep-futtatás befejeződik, és az események halmozódnak fel.
- A felhalmozott események a fogyasztóhoz kerülnek.
- A következő szupersztep csak azután kezdődik, hogy a fogyasztó megkapja az előző szupersztephez tartozó eseményeket.
Mikor érdemes használni a Lockstep-et?
Akkor használja a Lockstepet, ha a determinisztikus viselkedés fontosabb, mint az alacsony késleltetésű streamelés, például az egységtesztek, a hibakeresés vagy az olyan forgatókönyvek, amelyekben teljes mértékben fel szeretné dolgozni egy szuperstep eseményét a következő szuperstep kezdete előtt.
Végrehajtási mód kiválasztása
A legtöbb éles forgatókönyv esetében használja inproc.Default vagy inproc.OffThread. Akkor érdemes használni inproc.Lockstep , ha a determinisztikus eseményrendezés fontosabb a streamelési késésnél, például a teszteknél. Csak akkor használja inproc.Concurrent , ha a munkafolyamat minden kötése támogatja az egyidejű megosztott végrehajtást.
// Production: OffThread (default)
stream, err := inproc.Default.RunStreaming(ctx, wf, input)
if err != nil {
return err
}
defer stream.Close(ctx)
// Testing: Lockstep for deterministic behavior
testStream, err := inproc.Lockstep.RunStreaming(ctx, wf, input)
if err != nil {
return err
}
defer testStream.Close(ctx)
Nem-streamelő végrehajtás
Az összes végrehajtási környezet támogatja a nem streamelő Run módot is, amely a következő leállásig fut, és a kibocsátott eseményeket a visszaadott futtatásban tárolja.
run, err := inproc.Default.Run(ctx, wf, input)
if err != nil {
return err
}
for evt := range run.NewEvents() {
if output, ok := evt.(workflow.OutputEvent); ok {
fmt.Printf("Final result: %v\n", output.Output)
}
}