8

Ho abituato ad usare Parallel.For() nelle estensioni parallele di Net in quanto è un modo semplice di parallelizzare codice senza dover aprire manualmente e mantenere fili (che può essere complicato). Ora sto osservando un ciclo infinito (fare qualcosa finché non lo segnale di interromperlo) che desidero parallelizzare, non c'è un argomento libero da Parallel.For() sovraccarico per fare questo, quindi ci chiedevamo quale sarebbe l'approccio migliore qui essere. In linea di massima ho potuto solo fare qualcosa di simile: (?)Qual è il modo migliore per ottenere un loop infinito parallelo?

Parallel.For(0, int.Max) 

Ma sto ritenendo sospetto che potrebbe non essere un modello atteso/efficiente per la logica di lavoro di partizionamento per gestire

Un'altra opzione è qualcosa di simile:

for(;;) 
{ 
    Parallel.For(0, 128, delegate() 
    { 
     // Do stuff. 
    } 
} 

Ma ciò sembra inelegante e può anche comportare un partizionamento del lavoro inefficiente.

questo momento il mio istinto è quello di farlo manualmente creando e mantenendo le mie discussioni, ma sarei interessato a ottenere un feedback/opinioni su questo. Grazie.

UPDATE === ===

sto utilizzando una versione semplificata del codice dal l'articolo del risposta accettata (ho rimosso il parametro ParallelOptions). Ecco il codice ...

public class ParallelUtils 
{ 
    public static void While(Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    } 

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
} 

Un esempio d'uso potrebbe essere:

Func<bool> whileCondFn =() => !_requestStopFlag; 
ParallelUtils.While(whileCondFn, delegate() 
{ 
    // Do stuff. 


}); 
+0

c'è qualche modello di threading che è possibile consumare – MethodMan

risposta

2

Se (veramente) vuole qualcosa di infinito, allora si vuole che il minor numero di nuclei di possibili. Nessuno degli Parallel.For___ sarebbe una buona scelta.

Quello che (probabilmente) è necessario è un thread separato o un'attività creata con l'opzione LongRunning.

E poi fanno aspettare su un semaforo, o come una chiamata di sonno ultima istanza() il più spesso possibile.

+1

Il contesto per questo problema è che si tratta di un progetto di data mining. Sto prendendo il codice di analisi dei dati che attualmente viene eseguito a tempo indeterminato (ad esempio, eseguito durante la notte e poi segnalandolo per interrompere la mattina successiva) e trasferendolo su più thread, in quanto tale voglio che venga eseguito a tempo indeterminato su tutti i core. – redcalx

+4

@locster - Avere un thread "infinito" master che crea un thread figlio per il suo lavoro. –

1

Considerando che si tratta di infinit richiesta calcolo, ma è necessario disporre di uno stato finit su ogni "ciclo", direi che vorrei cambiare una soluzione con un for(;;) circuito esterno per eseguire una chiamata Parallel.ForEach(...) su qualche evento/stato modificare. Come un segnale Monitor, event notifica, o qualcosa del genere ...

Problemi correlati