Esecuzione di una profondità Prima Cerca in modo iterativo utilizzando l'elaborazione asincrona / parallela?

1

Ecco un metodo che esegue una ricerca DFS e restituisce un elenco di tutti gli elementi con un ID elemento di livello superiore. Come posso modificare questo per sfruttare l'elaborazione parallela? Attualmente, la chiamata per ottenere gli elementi secondari viene effettuata una per volta per ogni elemento nello stack. Sarebbe bello poter ottenere contemporaneamente gli elementi secondari per più elementi nello stack e compilare più rapidamente la mia lista di ritorno. Come posso fare questo (usando async / await o TPL, o qualsiasi altra cosa) in modo thread-safe?

private async Task<IList<Item>> GetItemsAsync(string topItemId)
{
    var items = new List<Item>();   
    var topItem = await GetItemAsync(topItemId);

    Stack<Item> stack = new Stack<Item>();           
    stack.Push(topItem);
    while (stack.Count > 0)
    {
        var item = stack.Pop();
        items.Add(item);                   

        var subItems = await GetSubItemsAsync(item.SubId);

        foreach (var subItem in subItems)
        {
            stack.Push(subItem);
        }
    }

    return items;   
}

Stavo pensando a qualcosa in questo senso, ma non sta andando insieme:

var tasks = stack.Select(async item =>
{
    items.Add(item);           
    var subItems = await GetSubItemsAsync(item.SubId);

    foreach (var subItem in subItems)
    {
        stack.Push(subItem);
    }   
}).ToList();

if (tasks.Any())
    await Task.WhenAll(tasks);

La lingua che sto utilizzando è C #.

    
posta Prabhu 21.08.2014 - 20:39
fonte

1 risposta

1

Mi sembra che, quando si recupera l'elenco di elementi secondari, invece di inserirli in una pila, è necessario elaborare ogni sottotema in modo asincrono elaborando ciascuno nella propria attività. Solo quando tutte le attività sono state completate ( Task.WhenAll ), prendi i loro risultati, li metti in pila e ti restituiscono.

Ovviamente non vuoi un milione di compiti, quindi forse lo fai solo per un massimo di fan out e ricollegati all'approccio iterativo basato su stack oltre.

    
risposta data 23.08.2014 - 10:48
fonte

Leggi altre domande sui tag