2011-01-05 18 views
18

Comprendo che il nuovo TPL (Task Parallel Library) ha implementato Parallel.ForEach() in modo che funzioni con "parallelismo espresso". Il che significa che non garantisce che i tuoi delegati eseguiranno più thread, ma controllerà per vedere se la piattaforma host ha più core, e se è vero, solo allora distribuisce il lavoro attraverso i core (essenzialmente 1 thread per core) ..NET 4 ... Parallel.ForEach() domanda

Se il sistema host non ha più core (diventando sempre più difficile trovare un computer di questo tipo), eseguirà il codice in modo sequenziale come farebbe un normale ciclo foreach. Roba carina, francamente.

Normalmente vorrei fare qualcosa di simile a quanto segue per posizionare la mia operazione lungo in esecuzione su un thread in background dal ThreadPool:

ThreadPool.QueueUserWorkItem (nuova WaitCallback (targetMethod), nuova Object2PassIn());

In una situazione in cui il computer host ha un solo core, il Parallel.ForEach() del TPL posiziona automaticamente l'invocazione su un thread in background? Oppure, dovrei invocare manualmente qualsiasi chiamata TPL da uno sfondo in modo tale che se eseguo da un singolo core computer almeno quella logica sarà fuori dal thread di dispacciamento della GUI?

La mia preoccupazione è che se lascio il TPL responsabile di tutto questo voglio assicurare se determina si tratta di una singola cassa d'anima che marshalling ancora il codice che c'è dentro del ciclo Parallel.ForEach() su un thread in background come avrei fatto, in modo da non bloccare la mia GUI.

Grazie per ogni pensiero o consigli si possono avere ...

+1

Solo un rapido follow-up su questo: TPL Rocks! Non riesco a superare quanto sono più veloce a realizzare varie app con pochi piccoli aggiustamenti utilizzando le chiamate TPL rispetto alla tariffa "standard". Sto osservando i tempi di elaborazione su vari articoli ridotti dell'80%. MS lo ha davvero buttato fuori dal parco su questo - ottimo lavoro ragazzi. – BonanzaDriver

risposta

19

I suoi presupposti sono errati.
Parallel.For è, sempre, una chiamata di blocco.

Anche se il computer ha più core, attende comunque che tutti i thread finiscano prima di tornare.

Se non si desidera bloccare l'interfaccia utente, sarà sempre necessario chiamare il ThreadPool.

+0

Cool - grazie SLaks – BonanzaDriver

+3

Potrebbe sempre inserirli in un'attività e utilizzare una continuazione per attendere il suo completamento, quindi notificare l'interfaccia utente. –

0

Penso che se si dispone di requisiti esatti sull'istanza/numero di thread, è necessario farlo da soli. Ho l'impressione che il tipo di chiamate Parallel.ForEach sia per ottenere un coinvolgimento dichiarativo dei core. Non lo so per certo, ma ho il minimo sospetto che sarebbe una cattiva scelta per qualcosa che blocca l'I/O (ad esempio).

+0

Dalla documentazione che ho letto finora è stato originariamente concepito per set di problemi "legati al processore". Ma questo non esclude di usarlo per IO. In effetti, ciò che mi ha spinto a dare un'occhiata seria al TPL è il fatto che ho un'app che esegue circa 7.800 query Web ... Ho una scatola quad core quadricromia (Xeon a 3,0 GHz) che esegue 24 GB di RAM su Windows 7 Ultimate 64-bit edition ... e questi richiedono da 25 a 28 minuti per essere completati. C'è qualche elaborazione aggiuntiva del download HTML, ma tu ottieni il mio punto. Ho cambiato questo in una chiamata TPL e ci sono voluti <5 minuti. – BonanzaDriver

0

Buona domanda. Suppongo che creerà ancora un thread anche se c'è solo un singolo core.

Avrei dovuto eseguire un test su una macchina single core. Dato che non ne ho uno, userò la macchina virtuale e imposterò la CPU dell'ambiente su 1 e vedrò quanti thread verrà generato da Parallel ForEach.

Si consiglia di leggere quanto segue:

Does Parallel limit the Number of Active Threads

1

Attraverso la mia esperienza con Parallel.ForEach e Parallel.For loop, ho notato che l'ordine può essere fuori ordine, qualcosa che si potrebbe desiderare da considerare prima di implementare.

Come una base per il ciclo produrrà:

Prodotto 1 Prodotto 2 prodotto 3 Prodotto 4

e il ciclo parallelo in grado di produrre, ma non sempre:

Prodotto 3 Prodotto 1 Prodotto 2 Prodotto 4

Basta tenerlo a mente ragazzi.

Problemi correlati