Listener, logger, plotter - quale architettura di threading scegliere per questo?

1

Sto costruendo un programma che fa molte cose.

  • Ascolta in una porta. Ogni secondo viene ricevuta una stringa
  • Quando vengono ricevuti nuovi dati, devono essere registrati . Non sono consentiti errori o voci saltate
  • Una volta ricevuti i dati, è necessario aggiornare un plot sullo schermo. Questo è un calcolo costoso. La mancanza di alcuni aggiornamenti non è critica.
  • Una volta al mese viene chiamata una funzione archiviazione per eseguire il backup dei log. Questo potrebbe richiedere un tempo imprecisato.

Sono nuovo nel threading e vorrei chiedere consigli sull'infrastruttura di threading . Da un lato, sembra che io abbia bisogno di almeno 1 thread aggiuntivo oltre al thread principale, per il listener delle porte.

D'altra parte, temo che se crei troppi thread:

  • potrebbero verificarsi problemi di sincronizzazione
  • L'app potrebbe diventare affamata di risorse

Qui è un codice proposto per l'ascoltatore. * La complessità del codice potrebbe esplodere

    
posta Vorac 12.09.2013 - 09:58
fonte

2 risposte

2

consulta il problema del consumatore produttore per le soluzioni generali al problema di sincronizzazione,

Penso che utilizzare un buffer circolare che compaia la voce più vecchia quando è piena invece di bloccare è la soluzione migliore

nel codice psuedo il thread del listener di porte sarà: (usando un'interfaccia come javas ArrayBlockingQueue

while(alive){
     record = read(port) //only blocking operation in the loop
     logger.logRecord(record)
     while(!plotqueue.offer(record)){ //try to push to plotter thread
         plotqueue.poll() // discard oldest if full
     }
}

quindi il thread del plotter sarà:

while(alive){
     record = plotqueue.take()//block until one is available

     plot(queue)
}
    
risposta data 12.09.2013 - 10:08
fonte
0

Questo è il tipo di problema in cui prospera node.js . Mi rendo conto che stai chiedendo una libreria Python, ma ti sto solo dicendo che se hai la libertà di cambiare linguaggio di programmazione, probabilmente dovresti farlo in questo caso.

Node.js utilizza la tecnologia web socket, il che significa che ogni client connesso al tuo sito web non dovrà eseguire il polling di nuove informazioni ogni secondo, rendendolo così scalabile con notevole efficienza.

Il modo in cui usi queste informazioni dipende interamente da te, ma ci sono molte librerie javascript che tracciano le informazioni da matrici di dati o da chiamate ripetute per aggiungere nuovi dati, il che significa che potresti fornire inizialmente un array, quindi dopo aver ricevuto nuove informazioni , semplicemente aggiungilo alla trama, che è probabilmente un modo molto efficiente di aggiornare la trama senza dover ridisegnare tutto (a seconda di cosa stai usando).

Se usi node.js, puoi scegliere di utilizzare un database NoSQL come MongoDB . Può essere locale per il tuo server, ma può anche essere esterno , che si occuperà del tuo problema di archiviazione.

Se la scalabilità è davvero la tua preoccupazione, ti consiglio vivamente di prendere in considerazione il passaggio a node.js per questo. È stato progettato principalmente per questi tipi di applicazioni Web. Se non hai familiarità con node.js, ti consiglio vivamente di impararlo comunque, anche se decidi di non seguire questa strada.

    
risposta data 12.09.2013 - 10:07
fonte

Leggi altre domande sui tag