İş Akışı Yürütme Modları

.NET'te bir iş akışı çalıştırılırken yürütme modu, süpersteps'lerin nasıl işlendiğini ve olayların tüketiciye nasıl teslim edildiğini kontrol eder. InProcessExecution sınıfı iki yürütme modunu kullanıma sunar: OffThread ve Lockstep.

Genel bakış

OffThread (Varsayılan) Eşzamanlılık
Süper adım yürütme Arka plan iş parçacığı Tüketicinin iş parçacığı
Olay teslimi Anında, olaylar tetiklenirken Her üst adım tamamlandıktan sonra toplu işlendi
Adım yürütme Etkinlik işleme sürecinden bağımsız Toplu işlenmiş olaylar tüketilene kadar duraklatıldı
Eşzamanlılık Süpersteps çalışırken tüketici olayları okur Tüketici ve süper adım yürütmesi dönüşümlü olarak gerçekleşir.
En uygun Gerçek zamanlı akış, üretim senaryoları Test, hata ayıklama, belirlenimci sıralama

OffThread

OffThread varsayılan yürütme modudur. Supersteps bir arka plan iş parçacığında çalıştırılır ve olaylar kanal tabanlı bir uygulama aracılığıyla oluşturulurken hemen akışa alınır.

// 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);

Nasıl çalışır?

  1. Bir arka plan görevi, iletiler beklemedeyken sürekli olarak süper adımlar çalıştırır.
  2. Yürütücüler çıkışlar veya olaylar verdikçe, elde edilen WorkflowEvent nesneler sınırsız Channel<WorkflowEvent> üzerine yazılır.
  3. Tüketici, WatchStreamAsync ile kanaldan olayları okur ve bunları üretildikçe gerçek zamanlı olarak alır.
  4. Tüm üst işlemler tamamlandığında ve hiçbir ileti kalmadığında, çalıştırma bir Idle veya PendingRequests durumuyla durur.

Üst adım döngüsü ve tüketici eşzamanlı olarak çalıştığından, olaylar tetiklenir tetiklenmez görünür; arabelleğe alma gecikmesi olmaz. Bu, OffThread'i bir kullanıcı arabiriminde belirteçlere göre belirteç güncelleştirmelerini görüntüleme gibi düşük gecikme süreli olay tesliminin önemli olduğu akış senaryoları için ideal hale getirir.

Eşzamanlı çalıştırmalar

OffThread, birden çok çalıştırmanın aynı iş akışı örneğini aynı anda paylaşmasına olanak tanıyan eşzamanlı bir değişkeni de destekler:

await using StreamingRun run = await InProcessExecution.Concurrent.RunStreamingAsync(workflow, input);

Önemli

Eşzamanlı yürütme, iş akışındaki tüm yürütücülerin oluşturucu içerisinde bildirilmesi veya üretim yöntemleri olarak sağlanmasını gerektirir.

Eşzamanlılık

Kilit modunda, süper adımlar bir arka plan görevi yerine tüketicinin iş parçacığında çalışır. Olaylar her üst adım sırasında birikir ve üst adım tamamlandıktan sonra toplu iş olarak yayılır.

await using StreamingRun run = await InProcessExecution.Lockstep.RunStreamingAsync(workflow, input);

Nasıl çalışır?

  1. Tüketici, yürütme döngüsünü yönlendiren öğesini çağırır WatchStreamAsync.
  2. Bir üst adım tamamlanmaya kadar çalışır ve olaylar bir kuyrukta birikir.
  3. Üst adım tamamlandıktan sonra, kuyruğa alınan tüm olaylar tüketiciye iletilebilir.
  4. Sonraki süper adım, tüketici öncekinden tüm olayları aldıktan sonra ancak başlar.

Bu değişen düzen, tüketicinin ve iş akışı altyapısının hiçbir zaman aynı anda çalışmayamayacağı anlamına gelir. Olay teslimi belirleyicidir; bir üst adımdaki tüm olayların bir sonraki üst adımdaki herhangi bir olaydan önce gelmesi garanti edilir.

Lockstep ne zaman kullanılır?

Lockstep şu durumlarda kullanışlıdır:

  • Test — belirlenimci olay sıralama, onaylamaları basitleştirir.
  • Hata ayıklama — Yürütme tüketicinin iş parçacığında kaldığında adım adım hata ayıklama daha kolaydır.
  • Sıralı işleme — bir üst adım başlamadan önce bir üst adımın olaylarını tam olarak işlemeniz gereken senaryolar.

Yürütme Modu Seçme

Çoğu üretim senaryosu için varsayılan OffThread modu önerilir. En iyi yanıt hızını sağlar ve tüketici olayları işlerken iş akışının işlemeye devam etmesini sağlar.

Birim testlerinde veya hata ayıklama oturumlarında olduğu gibi belirleyici davranış performanstan daha önemli olduğunda Lockstep kullanın.

// 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);

Akışsız Yürütme

Her iki çalışma modu da RunAsync aracılığıyla akışsız yürütmeyi destekler. Akış dışı modda iş akışı tamamlanmak üzere çalıştırılır ve tüm olayları artımlı olarak akışla aktarmak yerine bir Run nesnede toplar:

Run run = await InProcessExecution.RunAsync(workflow, input);

// Access all emitted events
foreach (WorkflowEvent evt in run.OutgoingEvents)
{
    // Process events
}

Akışsız yürütme tamamlandıktan sonra tüm olayları topladığı için, OffThread'in gerçek zamanlı olay teslim avantajı geçerli değildir. Akış dışı senaryolardaki modlar arasındaki birincil fark iş parçacığı yönetimidir: OffThread, arka plan iş parçacığında süper adımları çalıştırarak tamamlanmasını beklerken çağıran iş parçacığını serbest bırakır, Lockstep ise çağıranın iş parçacığında süper adımları çalıştırarak, iş akışı bitene kadar bu süreci engeller.

Akışsız yürütme varsayılan OffThread modunu kullanır. Lockstep'i akışsız yürütmeyle kullanmak için:

Run run = await InProcessExecution.Lockstep.RunAsync(workflow, input);

Sonraki Adımlar

Yürütme modları Python iş akışları için geçerli değildir. Python iş akışları, zaman uyumsuz bir oluşturucu aracılığıyla üst işlem ve olay teslimi işleyen tek bir yürütme modeli kullanır. Bu model .NET Lockstep moduna benzer; tüketici oluşturucudan etkin bir şekilde olay çekmediği sürece adımlar ilerlemez.

Python iş akışlarını çalıştırma hakkında bilgi için bkz. İş Akışı Oluşturucusu ve Yürütme.

Go'da bir iş akışı çalıştırırken, yürütme ortamı superstep’lerin nasıl işlendiğini ve olayların tüketiciye nasıl iletildiğini kontrol eder. Paket workflow/inproc üç ortamı kullanıma sunar: Default/OffThread, Lockstepve .Concurrent

Genel bakış

OffThread / Varsayılan Eşzamanlılık Eş zamanlı
Süper adım yürütme Arka planda çalışan goroutine Olay tüketicisi tarafından yönlendirilir Arka plan goroutine
Olay teslimi Anında, olaylar tetiklenirken Akış tüketildikçe toplu hâle getirilir Anında, olaylar tetiklenirken
En uygun Gerçek zamanlı akış, üretim senaryoları Test, hata ayıklama, belirlenimci sıralama Eşzamanlı güvenli bağlamalarla paylaşılan iş akışı örnekleri

OffThread

OffThread varsayılan yürütme modudur. Bunlar eşdeğerdir:

stream, err := inproc.Default.RunStreaming(ctx, wf, input)
stream, err := inproc.OffThread.RunStreaming(ctx, wf, input)

Nasıl çalışır?

  1. Arka plan goroutine'i, iletiler beklemedeyken süper adımları çalıştırır.
  2. Yürütücüler çıktılar veya olaylar ürettikçe, iş akışı olayları akışa yazılır.
  3. Tüketici, olayları WatchStream ile okur ve bunları üretildikçe alır.
  4. Tüm üst işlemler tamamlandığında ve hiçbir ileti kalmadığında, çalıştırma boşta veya beklemede-istek durumuyla durur.

Eşzamanlı çalıştırmalar

İş akışındaki tüm yürütücü bağlamaları eşzamanlı paylaşılan yürütmeyi desteklediğinde kullanın inproc.Concurrent :

stream, err := inproc.Concurrent.RunStreaming(ctx, wf, input)
if err != nil {
    return err
}
defer stream.Close(ctx)

Eşzamanlılık

Lockstep modunda, tüketici akıştan okudukça iş akışı yürütülmesi ilerler. Bu, test ve hata ayıklama için olay sıralamasını belirleyici hale getirir.

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
}

Nasıl çalışır?

  1. Tüketici, yürütme döngüsünü yönlendiren öğesini çağırır WatchStream.
  2. Bir süper adım tamamlanana kadar yürütülür ve olaylar biriktirilir.
  3. Birikmiş olaylar tüketiciye teslim edilir.
  4. Sonraki süper adım ancak tüketici önceki üst adımın olaylarını aldıktan sonra başlar.

Lockstep ne zaman kullanılır?

Birim testleri, hata ayıklama veya sonraki üst adım başlamadan önce bir üst adımın olaylarını tam olarak işlemek istediğiniz senaryolar gibi belirleyici davranış düşük gecikme süreli akıştan daha önemli olduğunda Lockstep kullanın.

Yürütme Modu Seçme

Çoğu üretim senaryosunda inproc.Default veya inproc.OffThread kullanın. Testlerde olduğu gibi, belirleyici olay sıralamanın akış gecikme süresinden daha önemli olduğu durumlarda kullanın inproc.Lockstep . Yalnızca iş akışındaki her bağlama eşzamanlı paylaşılan yürütmeyi desteklediğinde kullanın inproc.Concurrent .

// 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)

Akışsız Yürütme

Tüm yürütme ortamları, bir sonraki durma noktasına kadar çalışan ve üretilen olayları döndürülen çalıştırmada depolayan akışsız Run özelliğini de destekler.

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

Sonraki Adımlar