Pianificazione di alcune attività a uso intensivo della CPU

5

Ho bisogno di pianificare un piccolo numero di attività che richiedono molta CPU da eseguire ogni tanto, leggendo da dati condivisi e scrivendo su buffer dedicati. Non voglio necessariamente eseguire il mio programma, ma non sono sicuro che librerie come Quartz siano appropriate per questo piccolo di scala. Sto usando Java 8 in un ambiente server, ma con nodi isolati e non importa se alcune iterazioni vengono perse ogni tanto.

Dettagli problema:

Ho 5 buffer di dati di dati binari da elaborare. Prima di elaborare ciascun buffer, alloco una destinazione vuota e la funzione scrive su quella destinazione. Ogni buffer deve essere elaborato su un programma diverso con una funzione diversa, sebbene tutte le funzioni possano gestire un'iterazione mancante e calcolare il doppio al prossimo passaggio.

Il primo buffer è ~ 30mb e richiede ~ 200ms per essere elaborato e deve essere elaborato ogni 500ms. Il resto è di circa 6 Mb ciascuna e richiede circa 50 ms per essere elaborato e deve essere elaborato ogni 1000 ms.

Le funzioni di elaborazione devono solo scrivere nel buffer di destinazione e sono prive di stato, ma possono leggere qualsiasi buffer esistente. L'intero processo avrà almeno una propria discussione e potrebbe avere più thread. Niente di tutto questo è critico, non sarà cluster e verrà mantenuto quasi esclusivamente in memoria.

Esempio:

Un'implementazione abbastanza stupida potrebbe essere:

for (layer in parent.layers) {
    new thread(() => {
        while (true) {
            buffer = new int[layer.data.length]
            process(layer.data, buffer, parent)    // remember, this can access other layers
            layer.data = buffer
            sleep(layer.increment)
        }
    }
}    

L'esecuzione di ogni livello sul proprio thread rende l'elaborazione abbastanza semplice, purché nulla nel mezzo sia bloccato. Afferrando ogni livello a cui la funzione di elaborazione si preoccupa quando inizia un'iterazione e rilasciandoli alla fine dovrebbe funzionare, poiché sono di sola lettura e non sono preoccupato per un altro thread che sostituisce il riferimento.

Domanda:

  1. Ci sono problemi con Timer per questo tipo di lavoro? Offrono un modo per scartare o attendere l'iterazione precedente?
  2. Il quarzo è una scelta praticabile o semplicemente assurda?
  3. Può bastare qualcosa di semplice come System.nanoTime con questa precisione?
posta ssube 11.08.2014 - 21:35
fonte

1 risposta

1

L'utilizzo di un singolo Timer e di un ExecutorService illimitato (pool di thread) per questo tipo di pianificazione generica può essere molto potente. Tuttavia, non interrompe l'esecuzione concorrente dell'attività, nel caso in cui l'invocazione precedente non fosse ancora completata.

Abbiamo combinato Timer ed ExecutorService solo per questo scopo, insieme alla possibilità di limitare il numero di attività concorrenti in base al numero di CPU disponibili per il sistema (appropriato per le attività associate alla CPU):

link

Per interrompere la chiamata simultanea con solo questi due strumenti, devi proteggere la tua protezione.

Recentemente ho risolto questo problema creando un "ConcurrencyLimiter" che serializzerà l'accesso a un pezzo arbitrario di codice / risorsa dato un oggetto chiave arbitrario. Se un secondo thread tenta di eseguire la stessa operazione, semplicemente attenderà e utilizzerà il risultato del primo thread. Pertanto, la concorrenza viene evitata e entrambi i thread ottengono una risposta significativa.

link

Per quanto riguarda la limitazione della concorrenza all'interno del task scheduler stesso, esiste anche una semplice implementazione in puro Java di cron che consente di evitare l'esecuzione simultanea e gestisce tutta la pianificazione:

link

Fonte al link (dipende da link ) e collegamento Tutto LGPLv3 e gratuito per il mondo, senza dipendenze esterne e Java 1.6 +.

Il punto qui non è quello di collegare il mio codice. Voglio solo precisare che puoi gestirlo a livello di pianificazione o all'interno dell'attività stessa.

Ci dispiace - le domande vaghe ottengono risposte vaghe.

    
risposta data 30.01.2015 - 19:58
fonte

Leggi altre domande sui tag