Domanda

La mia domanda potrebbe sembrare un po 'ingenuo, ma io sono abbastanza nuovo con la programmazione multi-threaded.

Sto scrivendo un'applicazione che elabora dati esterne in arrivo. Per ogni dato che arriva una nuova attività viene creata nel seguente modo:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

Gli elementi di dati arrivano molto velocemente (ogni secondo, mezzo secondo, ecc ...), si creano tanti compiti. Manipolazione ogni attività potrebbe richiedere circa un minuto. Durante il test si ho visto che il numero di thread è in aumento per tutto il tempo. Come faccio a limitare il numero di attività create, in modo che il numero di thread di lavoro effettivo è stabile ed efficiente. Il mio computer è solo dual core.

Grazie!

È stato utile?

Soluzione

Uno dei vostri problemi è che lo scheduler di default vede le attività che durano per un minuto e parte dal presupposto che essi sono bloccati su un altro compiti che devono ancora essere eseguiti. Per cercare di cose sbloccarla orari più compiti, da qui la crescita filo sospeso. Ci sono un paio di cose che puoi fare qui:

  • Fai la tua attività più breve (probabilmente non un'opzione).

  • Scrivi un programmatore che si occupa di questo scenario e non aggiunge più thread.

  • Utilizzare SetMaxThreads per prevenire senza limiti di crescita pool di thread.

Si veda la sezione di iniezione Discussione qui:

http://msdn.microsoft.com/en-us/library/ ff963549.aspx

Altri suggerimenti

Si dovrebbe considerare di usare il modello produttore / consumatore con un BlockingCollection<T> intorno ad un ConcurrentQueue<T> in cui si imposta il BoundedCapacity a qualcosa che abbia un senso date le caratteristiche del carico di lavoro. Potete fare la vostra configurabile BoundedCapacity e quindi modificare come si esegue attraverso alcune sessioni di profiling per trovare il punto debole.

Mentre è vero che il TPL si prenderà cura di fare la fila dei compiti che si crea, la creazione di troppi compiti non venire senza penalità. Inoltre, qual è il punto di produrre più lavoro di quanto si può consumare? Si vuole produrre abbastanza lavoro che i consumatori non saranno mai fame, ma non si vuole arrivare al molto più avanti di te stesso, perché questo è solo uno spreco di risorse e potenzialmente rubare quelle stesse risorse dai consumatori.

È possibile creare un TaskScheduler personalizzato per la libreria Task Parallel e poi pianificare le attività su quel passando un'istanza di esso al costruttore TaskFactory.

Ecco un esempio di come farlo: Utilità di pianificazione con il massimo grado di parallelismo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top