Pattern produttore-consumatore con restrizioni del consumatore

4

Ho un problema di elaborazione che sto pensando sia un classico problema produttore-consumatore con le due rughe aggiunte che potrebbe esserci un numero variabile di produttori e c'è la restrizione che non si possa consumare più di un articolo per produttore a ogni volta. Generalmente avrò 50-100 produttori e altrettanti consumatori come core CPU sul server. Voglio massimizzare il rendimento dei consumatori assicurandomi che non ci siano mai più di un articolo di lavoro in lavorazione da un singolo produttore.

Questo è più complicato del classico problema produttore-consumatore che, a mio parere, presuppone un singolo produttore e nessuna restrizione su quali elementi di lavoro possano essere in corso in qualsiasi momento. Penso che il problema di più produttori sia risolto in modo relativamente facile agguantando tutti gli elementi di lavoro su una singola coda di lavoro protetta da una sezione critica.

Penso che la limitazione sull'elaborazione simultanea degli oggetti di lavoro da un singolo produttore sia più difficile perché non riesco a pensare a nessuna soluzione che non richieda a ciascun consumatore di notificare a un certo tipo di committente che un particolare oggetto di lavoro è stato completato in modo da sollevare la restrizione sugli articoli di lavoro da quel produttore. In altre parole, se Consumer2 ha appena completato WorkItem42 da Producer53, deve esserci una sorta di callback o notifica da Consumer2 a un dispatcher di lavoro per consentire al dispatcher di lavoro di rilasciare il successivo elemento di lavoro da Producer53 al successivo consumatore disponibile (sia Consumer2 o altrimenti).

Sto trascurando qualcosa di semplice qui? C'è un modello noto per questo problema? Gradirei qualsiasi suggerimento.

    
posta Dan 15.11.2011 - 02:18
fonte

1 risposta

2

Mi sembra che il tuo problema di concorrenza possa essere risolto utilizzando una coda per produttore, in cui ogni coda di produzione si rifiuta di distribuire un altro elemento di lavoro fino a quando il precedente non è stato completato. Quindi è sufficiente che ciascun consumatore selezioni correttamente tra le code di produzione non vuote. Questo dovrebbe essere abbastanza efficace se tutti i produttori generano oggetti di lavoro all'incirca allo stesso tasso e tutti gli elementi di lavoro richiedono approssimativamente la stessa quantità di elaborazione da parte del consumatore.

Se produttori diversi generano articoli di lavoro a ritmi diversi o richiedono quantità diverse di elaborazione, potrebbe essere necessario modificare la priorità per bloccare i produttori di tassi più bassi (o quelli che producono unità di lavoro a complessità più elevata) con priorità su un tasso più elevato (o basso carico di lavoro ) produttori.

Un esempio potrebbe essere per i consumatori selezionare la coda di produzione con la maggior parte degli articoli, non solo quelli senza articoli, sfortunatamente questo potrebbe produrre altri tipi di inefficienze. In questo modo, il bilanciamento delle priorità del tuo prossimo lavoro richiederà quindi un aggiustamento in base alle dinamiche del sistema.

    
risposta data 15.11.2011 - 14:20
fonte

Leggi altre domande sui tag