Aracılığıyla paylaş


Zamanlamaya genel bakış

Dilimlerle ilgili olan iki zamanlama Orleans biçimi vardır:

  1. İstek zamanlaması, istek zamanlaması bölümünde açıklanan zamanlama kurallarına göre, gelen ayrıntılı yürütme çağrılarının zamanlanması.
  2. Görev zamanlaması, tek iş parçacıklı bir şekilde yürütülecek zaman uyumlu kod bloklarının zamanlanması

Tüm tanecik kodu, tahılın görev zamanlayıcıda yürütülür ve bu da isteklerin tahılın görev zamanlayıcıda da yürütüldüğünü gösterir. İstek zamanlama kuralları birden çok isteğin eşzamanlı olarak yürütülmesine izin verse bile, bunlar paralel olarak yürütülemez çünkü tahılın görev zamanlayıcısı görevleri her zaman birer birer yürütür ve bu nedenle hiçbir zaman birden çok görevi paralel olarak yürütmez.

Görev zamanlama

Zamanlamayı daha iyi anlamak için, bir iletiyi günlüğe kaydeden, MyGrainbir süre bekleyip geri dönmeden önce başka bir iletiyi günlüğe kaydeden adlı DelayExecution() bir yöntemi olan aşağıdaki dilimi göz önünde bulundurun.

public interface IMyGrain : IGrain
{
    Task DelayExecution();
}

public class MyGrain : Grain, IMyGrain
{
    private readonly ILogger<MyGrain> _logger;

    public MyGrain(ILogger<MyGrain> logger) => _logger = logger;

    public async Task DelayExecution()
    {
        _logger.LogInformation("Executing first task");

        await Task.Delay(1_000);

        _logger.LogInformation("Executing second task");
    }
}

Bu yöntem yürütülürken, yöntem gövdesi iki bölümde yürütülür:

  1. İlk _logger.LogInformation(...) çağrı ve çağrısı Task.Delay(1_000).
  2. İkinci _logger.LogInformation(...) arama.

İkinci görev, çağrı tamamlanana kadar Task.Delay(1_000) tahılın görev zamanlayıcıda zamanlanmaz ve bu noktada grain yönteminin devamını zamanlar.

bir isteğin iki görev olarak nasıl zamanlandığı ve yürütülürken aşağıdaki grafik gösterimini görebilirsiniz:

Two-Task-based request execution example.

Yukarıdaki açıklama .NET'te görev zamanlamasının nasıl çalıştığına Orleans özgü değildir ve şöyledir: C# dilinde zaman uyumsuz yöntemler derleyici tarafından zaman uyumsuz durum makinesine dönüştürülür ve yürütme ayrı adımlarda zaman uyumsuz durum makinesinde ilerler. Her adım geçerli (varsayılan olarak TaskScheduler.Defaultolarak ) veya geçerli TaskScheduler SynchronizationContextüzerinden TaskScheduler.Currenterişilir) üzerinde zamanlanır. TaskScheduler kullanılıyorsa, yöntemindeki her adım, bu TaskScheduleröğesine geçirilen bir Task örnekle temsil edilir. Bu nedenle, Task içinde .NET iki kavramsal şeyi temsil edebilir:

  1. Üzerinde bekleyebileceğiniz zaman uyumsuz bir işlem. Yukarıdaki yöntemin DelayExecution() yürütülmesi, bekleyebileceğiniz bir Task ile temsil edilir.
  2. Zaman uyumlu bir iş bloğunda, yukarıdaki yöntemdeki DelayExecution() her aşama bir Taskile temsil edilir.

Kullanımdayken TaskScheduler.Default , devamlılıklar doğrudan .NET'e ThreadPool zamanlanır ve bir Task nesneye sarmalanmaz. Örneklerdeki Task devamlılıkların sarmalanması saydam bir şekilde gerçekleşir ve bu nedenle geliştiricilerin bu uygulama ayrıntılarını nadiren bilmesi gerekir.

görev zamanlaması Orleans

Her bir taneli etkinleştirme, tek iş parçacıklı yürütme modelini uygulamaktan sorumlu olan kendi TaskScheduler örneğine sahiptir. Dahili olarak, bu TaskScheduler ve WorkItemGrouparacılığıyla ActivationTaskScheduler uygulanır. WorkItemGroup, içinde bir olduğu yerde Task T sıralanmış görevleri Queue<T> tutar ve uygularIThreadPoolWorkItem. Şu anda sıralanmış TaskWorkItemGroup olan her bir öğesini yürütmek için kendisini .NET ThreadPoolüzerinde zamanlar. .NETThreadPool' yöntemini çağırdığındaWorkItemGroupIThreadPoolWorkItem.Execute(), WorkItemGroup sıralanan Task örnekleri tek tek yürütür.

Her bir dilimin kendisini .NET'te ThreadPoolzamanlayarak yürüten bir zamanlayıcısı vardır:

Orleans grains scheduling themselves on the .NET ThreadPool.

Her zamanlayıcı bir görev kuyruğu içerir:

Scheduler queue of scheduled tasks.

.NET ThreadPool , sıraya alınan her iş öğesini yürütür. Bu, tahıl zamanlayıcılarının yanı sıra aracılığıyla Task.Run(...)zamanlanan iş öğeleri gibi diğer iş öğelerini içerir:

Visualization of the all schedulers running in the .NET ThreadPool.

Not

Bir tahılın zamanlayıcısı aynı anda yalnızca bir iş parçacığında yürütülebilir, ancak her zaman aynı iş parçacığında yürütülemez. .NET ThreadPool , tahılın zamanlayıcısı her yürütülürken farklı bir iş parçacığı kullanmakta serbesttir. Hub'ın zamanlayıcısı, tek seferde yalnızca bir iş parçacığında yürütülmesini sağlamakla sorumludur ve tek iş parçacıklı yürütme modeli bu şekilde uygulanır.