Come progettare un allocatore di thread dinamico

2

Perdona il titolo se non è corretto, non sono sicuro di ciò che sto cercando di progettare.

Dire che ho un numero di attività che voglio eseguire, N.

Inoltre, ho un numero massimo di thread che posso allocare contemporaneamente, T.

Voglio eseguire molte di queste attività in asincrono come ho thread disponibili (fino a T), e una volta che un thread si libera voglio iniziare immediatamente una nuova attività sul thread che ha appena finito fino a quando tutte le attività sono state correre.

ESEMPIO

Ho 10 compiti da eseguire e 4 thread disponibili per eseguire queste attività. All'avvio dell'app, 4 thread iniziano l'esecuzione di 4 delle 10 attività, lasciando 6 attività rimanenti, quando termina una delle attività in esecuzione, immediatamente un'altra attività inizia a essere eseguita su un nuovo thread e ci sono 5 attività rimanenti. Questo va avanti fino a quando non ci sono più attività rimanenti da eseguire.

DOMANDA

Esiste un modello di progettazione o un'architettura di applicazione comune che posso studiare per creare un task runner come questo?

    
posta tt9 13.04.2016 - 17:17
fonte

1 risposta

1

Il modello di progettazione che più corrisponde alla tua descrizione sarebbe uno schema Producer Consumer con una coda tra ciascun lato.

Per le tue specifiche esatte, avresti 4 thread che consumano la coda, il che limiterà a 4 elementi in lavorazione in una volta.

A seconda della lingua, potrebbero esserci costrutti incorporati per la concatenazione della coda multi-thread (C # System.Collections.Concurrent per un esempio) o si potrebbe usare un queue server esterno per gestire il blocco per te (RabbitMQ, MSMQ ecc.)

Inoltre potrebbero esserci costrutti come il pool di thread in background in .net che gestirà parte della complessità dell'esecuzione effettiva dei thread ma che dipenderà molto dal linguaggio in cui questo verrà sviluppato.

Uso estesamente il pattern consumer consumer in un'applicazione C # che ho sviluppato utilizzando sia in memoria che in code esterne. Finché ci si prende cura del blocco in modo che solo un singolo utente afferri ogni articolo in coda, fornisce un modo molto semplice per distribuire il lavoro tra i thread.

(Per la mia implementazione specifica utilizzo System.Collections.Concurrent.BlockingCollection per alcune delle mie code e System.Threading.Tasks (la libreria parallela attività) per la gestione del threading dei miei clienti.)

    
risposta data 13.04.2016 - 19:25
fonte

Leggi altre domande sui tag