Esiste una cosa come "troppi thread"

5

Non ero sicuro se qui o SO fosse il posto giusto per chiederlo, ma qui va comunque.

Quindi voglio migliorare un sistema che è attualmente in esecuzione. Ha servizi e molte app autonome, ma nessuna di queste cose è adeguatamente coordinata. Ora voglio creare una mini app per dimostrare i miglioramenti del sistema se dovessimo costruire queste cose in un nuovo "framework", se lo farai.

L'idea è di creare un'applicazione dashboard che gestisca e generi report su un servizio in background. Il servizio verrà eseguito diciamo ogni 3 minuti e questo a sua volta chiamerà una classe (FileProcessor i.e.) che a sua volta chiama ciascun tipo di metodo Run del processore. Questo metodo Run sarà una chiamata per avviare un thread di una classe Runnable. Voglio quindi utilizzare questa classe runnable per conservare le proprietà del file che sta / stava elaborando, se esiste un errore - la causa, un'opzione per rieseguire il metodo, il suo stato corrente (cioè a che punto è in elaborazione).

Questi "runnables" a volte saranno un'interazione diretta con un file in una directory, o sarebbe un record nel database che richiede l'elaborazione di un file.

Ora avendo uno sfondo, vorrei chiedere quanto segue:

Immagina che l'interazione diretta con i file in una directory (ovvero la modifica di un'estensione) avvenga immediatamente in una "modalità batch" dove diciamo cinque file trovati in C:\Program Files\My App\Files\*.xyz e questo processo (direttamente dopo una ricerca nella directory ) rinomina tutti questi file in C:\Program Files\My App\Files\*.zyx uno alla volta, diciamo con il seguente:

foreach (FileInfo fi in di.GetFiles("*.xyz", TopDirectoryOnly))
{
    fi.MoveTo(Path.ChangeDirectory(fi.FullName, ".zyx"));
}

In modo opposto, i record recuperati dal database verranno assegnati a una thread separata per l'elaborazione, diciamo 10 processi di elaborazione dei file, verranno lanciati 10 thread di questo tipo Runnable, ognuno contenente informazioni sullo stato, ecc. Questi thread saranno aggiunto a un elenco per tenere traccia di questi processi per poter passare queste informazioni all'applicazione.

La ridenominazione dei file è semplice e veloce e quindi credo di metterla in una singola "chiamata di metodo", mentre i file che richiedono l'elaborazione possono essere compresi tra 20 e 700 righe in cui i valori vengono tracciati dalla linea e inseriti in un database MySQL. Per questo motivo voglio consentire a tutti i file di "avviarsi allo stesso tempo" in modo che diciamo che uno o due file di linea non blocchino / ritardino gli altri venti 15 file di linea che potrebbero essere stati tutti fatti al momento in un singolo 700 file di linea elaborato.

In sostanza vorrei sapere se qualcuno con più conoscenza ed esperienza di me può dire se questa è una buona idea o un modo per affrontare la soluzione. Forse mi manca qualcosa o il mio progetto potrebbe essere spento.

P.S. Questo servizio e questa applicazione verranno eseguiti su un server abbastanza efficiente.

Grazie in anticipo per qualsiasi direzione e / o consiglio.

    
posta JDProwler 20.07.2018 - 22:06
fonte

1 risposta

6

I thread hanno costi significativi - MOLTO approssimativamente - immagino 100K byte per thread (ognuno ha bisogno di uno stack per una cosa) e ognuno di essi mette un leggero onere sui componenti del sistema operativo (es. lo scheduler) che devono gestirli tutti.

I thread presentano un modello molto semplice per la gestione di compiti asincroni. Sono un grande fan di questo approccio.

Ma se userai molti thread, ti preghiamo di considerare l'uso di threadpool come modo per riutilizzare gli oggetti thread sottostanti (pur avendo molti runnables - non solo in esecuzione).

E - poiché stai usando C #, compiti asincroni ( link ) sono una strategia più efficiente da considerare.

Spesso però - la semplicità di implementazione è più importante dell'efficienza (fino a un certo punto). Quello che hai descritto con un pool di thread (per limitare il numero di thread effettivo) potrebbe funzionare correttamente.

    
risposta data 20.07.2018 - 22:35
fonte

Leggi altre domande sui tag