Sono interessato a una struttura dati identica a Java BlockingQueue, con l'eccezione che deve essere in grado di raggruppare oggetti nella coda. In altre parole, vorrei che il produttore fosse in grado di mettere oggetti in coda, ma avere il blocco utente su take()
fino a quando la coda raggiunge una certa dimensione (la dimensione del batch).Java BlockingQueue con il batching?
Quindi, una volta che la coda ha raggiunto la dimensione del batch, il produttore deve bloccare put()
fino a quando il consumatore ha consumato tutti gli elementi nella coda (nel qual caso il produttore inizierà a produrre nuovamente e il blocco del consumatore fino al batch è raggiunto di nuovo).
Esiste una struttura dati simile? O dovrei scriverlo (cosa che non mi dispiace), non voglio sprecare il mio tempo se c'è qualcosa là fuori.
UPDATE
Forse a chiarire le cose un po ':
La situazione sarà sempre come segue. Possono esserci più produttori che aggiungono oggetti alla coda, ma non ci sarà mai più di un consumatore che preleva oggetti dalla coda.
Ora, il problema è che ci sono più di questi setup in parallelo e seriale. In altre parole, i produttori producono articoli per più code, mentre i consumatori a loro volta possono anche essere produttori. Questo può essere più facilmente pensato come un grafico diretto di produttori, produttori di consumatori e, infine, consumatori.
Il motivo per cui i produttori devono bloccare fino a quando le code non sono vuote (@Peter Lawrey) è perché ognuno di questi verrà eseguito in una discussione. Se li lasci semplicemente a produrre quando lo spazio diventa disponibile, finirai con una situazione in cui hai troppi thread che tentano di elaborare troppe cose contemporaneamente.
Forse l'abbinamento con un servizio di esecuzione potrebbe risolvere il problema?
Voglio bloccare il produttore mentre il consumatore è occupato. –
Interessante, la maggior parte dei sistemi fa di tutto per evitarlo. ;) Il secondo suggerimento farà esattamente questo. Se vuoi bloccare il produttore, perché stai usando più thread? non sarebbe più semplice per il "produttore" essere il processore/consumatore, così come non sembra che vogliano che funzionino allo stesso tempo. –
Si prega di consultare il mio aggiornamento. Il design richiede anche ai produttori di bloccare in modo che il numero di thread in esecuzione sia mantenuto basso. Inoltre, risolve un problema di dipendenza tra produttori e consumatori. –