Domanda

Sto costruendo un motore di elaborazione in background che supporti l'eliminazione sia degli elementi da elaborare che di quelli in fase di elaborazione.Questo serve per l'utilizzo in un'applicazione Winforms che richiederà un'elaborazione pesante di alcuni elementi di input, quindi sto costruendo un motore di coda in cui posso accodare gli elementi del carico di lavoro e, quando vengono elaborati, ricevo una notifica con i risultati.

La domanda è: questa coda conterrà quasi sempre molti elementi con cui cominciare, e ho pensato che invece di scaricare semplicemente tutto nel threadpool, avrei inserito solo i primi N elementi nel threadpool e avrei continuato a riempirli quando sono elaborato.Il motivo per cui voglio farlo è che una volta scaricati nel threadpool, loro Volere essere elaborati e, anche se contrassegnati come scartati, occuperanno comunque tempo in coda.

Con l'implementazione del recupero che ho realizzato, posso rimuovere gli elementi dalla coda se vengono scartati e inserirli nella coda solo quando è il loro turno, per così dire.

Quindi la domanda è: come potrei calcolare questo numero N, il numero di elementi da inserire e mantenere nella coda del pool di thread.

Problemi che ho considerato:

  • Potrei voler accodare 2 * numero di processori, che vedo è un numero tipico di elementi, per garantire che tutti i processori funzionino
  • Tuttavia, se l'elaborazione effettiva di alcuni elementi è superveloce (cosa che può accadere), la coda nel pool di thread viene esaurita prima che la mia classe possa riempirsi con più lavoro, quindi forse vorrei un numero maggiore per evitare di sottoutilizzare il processori
  • Dovrei creare una routine di regolazione automatica per calcolare il numero ottimale in base al tempo corrente impiegato da ciascun elemento, in modo che se sono tutti super veloci, il numero è molto più alto e se l'elaborazione richiede un po' di tempo, dovrebbe rimanere Basso?

Cosa ne pensi?

Nuovo:Ok, a causa di una delle risposte, spiegherò un po' di più.Ogni elemento inserito in coda è contrassegnato da qualcosa di unico.Se scarico un altro elemento nella coda con la stessa chiave di un elemento esistente, quel vecchio elemento viene considerato "Scartato" e deve essere rimosso.Se l'elemento è in fase di elaborazione, una proprietà sull'elemento del carico di lavoro è impostata su true, una proprietà "IsDicarded", che il metodo di elaborazione è responsabile della chiamata.Se rileva un elemento scartato, dovrebbe chiudersi presto, senza restituire risultati.

Forse dovrei sperimentare un po' di più e provare a scaricare tutto nel threadpool.

Nuova domanda:C'è un limite al numero di articoli che posso mettere in coda?In caso contrario, questo semplificherebbe molto facilmente la mia lezione.

Nota:Quando dico "elaborazione lunga", intendo nell'ordine di 1-10 secondi.Il threadpool è anche il migliore per questo?Vedo note in tutto il Web su "l'elaborazione dovrebbe essere rapida", ma cosa sia "veloce" non viene mai menzionato.La velocità è nell'ordine dei millisecondi qui?

È stato utile?

Soluzione

Conosci Ami Bar? Pool di thread intelligente?

Sembra che la sua implementazione ti consenta di cancellare un elemento non elaborato e di aumentare dinamicamente i thread come richiesto, fino a un limite rigido;Io personalmente uso 100 * Environment.ProcessorsCount

Altri suggerimenti

È possibile semplificare l'approccio modificando i tuoi articoli per verificare innanzitutto che siano ancora necessari prima che svolgano qualsiasi lavoro?Ciò eviterebbe il problema di limitare il numero nel pool, poiché puoi semplicemente aggiungerli tutti e quando ogni elemento viene elaborato uscirà se non più necessario.

Il numero di operazioni che possono essere messe in coda nel pool di thread è limitato solo dalla memoria disponibile;Tuttavia, il pool di thread limita il numero di thread che possono essere attivi nel processo contemporaneamente.Per impostazione predefinita, il limite è di 250 thread di lavoro per CPU e 1.000 thread di completamento I/O.

È possibile controllare il numero massimo di thread utilizzando i metodi getMaxThreads e SetMaxThreads.

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

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