Zamanlamaya genel bakış
Dilimlerle ilgili olan iki zamanlama Orleans biçimi vardır:
- İ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ı.
- 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, MyGrain
bir 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:
- İlk
_logger.LogInformation(...)
çağrı ve çağrısıTask.Delay(1_000)
. - İ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:
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:
- Üzerinde bekleyebileceğiniz zaman uyumsuz bir işlem. Yukarıdaki yöntemin
DelayExecution()
yürütülmesi, bekleyebileceğiniz birTask
ile temsil edilir. - Zaman uyumlu bir iş bloğunda, yukarıdaki yöntemdeki
DelayExecution()
her aşama birTask
ile 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 WorkItemGroup
aracı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ış Task
WorkItemGroup
olan her bir öğesini yürütmek için kendisini .NET ThreadPool
üzerinde zamanlar. .NETThreadPool
' yöntemini çağırdığındaWorkItemGroup
IThreadPoolWorkItem.Execute()
, WorkItemGroup
sıralanan Task
örnekleri tek tek yürütür.
Her bir dilimin kendisini .NET'te ThreadPool
zamanlayarak yürüten bir zamanlayıcısı vardır:
Her zamanlayıcı bir görev kuyruğu içerir:
.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:
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.