Skalierung To Be habe ich folgendes (vereinfacht) Code:Nested Async/Await erscheint nicht
public async Task GetData(DomainObject domainObject, int depth)
{
// This async operation is really quick, and there's usually like five.
IEnumerable<TierOne> tierOnes = await domainObject.GetTierOnesAsync();
var tierOneTasks = tierOnes.Select(async tierOne =>
{
// This async operation is really quick and there's usually like three.
IEnumerable<TierTwo> tierTwos = await tierOne.GetTierTwosAsync();
if (depth <= TierTwoDepth)
return;
var tierTwoTasks = tierTwos.Select(async tierTwo =>
{
// This async operation is usually fast, and there's usually >= 100.
IEnumerable<TierThree> tierThrees = await tierTwo.GetTierThreesAsync();
if (depth <= TierThreeDepth)
return;
var tierThreeTasks = tierThrees.Select(async tierThree =>
{
// This async operation is SLOW, and there's usually.. 50?
await tierThree.GetTierFoursAsync();
});
await Task.WhenAll(tierThreeTasks.ToArray());
});
await Task.WhenAll(tierTwoTasks.ToArray());
});
await Task.WhenAll(tierOneTasks.ToArray());
}
Basiert weg von dem, was ich gesehen habe, ist es nicht sehr gut Skalierung zu sein scheint. Alle Async
Operationen sind "echte async" Operationen, was bedeutet, dass sie alle I/O sind.
Verwende ich Async/Await falsch für dieses Szenario? Ausgehend von meinen aktuellen Beobachtungen skaliere ich nicht so, wie ich es erwarten würde. Würde TPL DataFlow meine Lösung sein?
"es scheint sehr gut skaliert zu sein" ist das ein Tippfehler und du solltest ein "nicht" da reinlegen? Und wenn ja, in welcher Art und Weise skalieren Sie, dass es schneller fertig wird oder das System nicht so stark belastet? Wie testen Sie die Skalierung? –
Sie verwenden viele 'IEnumerables' als asynchrone Rückgabewerte. Sind Sie sicher, dass eine verzögerte Durchführung Ihre vermutete Parallelisierung nicht beeinträchtigt? – nvoigt
@ScottChamberlain Ja das war ein Tippfehler. Ich erwarte, dass es schneller endet. Ich verstehe, dass es nur so schnell gehen wird, wie das Empfangsende meiner asynchronen Operationen ablaufen wird. Es sieht so aus, als würde ich, wenn ich 1500 Aufgaben spoole, mehr als nur 3 oder 4 im 'Warte'-Teil des Zustandsautomaten stecken bleiben. (Sorry, wenn das keinen Sinn ergibt. Es ist spät hier und ich bin sehr müde.) – Cameron