Come un programma elabora le esecuzioni concorrenti

0

Ho un'applicazione console che viene eseguita prendendo i parametri di input. Può essere configurato passando il parametro del nome del report, ad es. %codice%. Colpisce il database e recupera i dati nel file xml e li invia al sito sftp.

Tutto questo processo viene registrato e reportgen.exe sales.xml viene salvato in una directory. Questo xml files deve essere pianificato su base giornaliera, quindi cosa succede se l'exe è programmato contemporaneamente con parametri diversi.

È thread-safe e può essere considerato come esecuzione indipendente facendo ciò che dovrebbe fare?

Modifica Usa log4net per registrare le informazioni di debug. in un file. Quindi, come scrive le istruzioni del registro in un singolo file per le esecuzioni concorrenti.

    
posta Sunny 14.08.2013 - 16:48
fonte

3 risposte

1

Beh, dipende da come hai programmato la tua applicazione. Siamo in grado di visualizzare un paio di insidie, che puoi trovare sulla tua strada.

insidie

Il primo problema può verificarsi nel database. L'applicazione accede al database, recupera i dati da varie tabelle e quindi avvia l'elaborazione dei dati. Ma improvvisamente l'applicazione si ferma. Alcuni dati sembrano essere incoerenti. Cosa è successo qui?

Quello che è successo è che hai caricato i tuoi dati da varie tabelle senza utilizzare le transazioni. Il database non è in grado di fornire la coerenza di lettura e qualcun altro ha aggiornato una delle tabelle.

Quindi esegui le query critiche in un'unica transazione, in modo che il tuo database possa fornire la coerenza di cui hai bisogno.

Il secondo problema si verifica a livello di file system. Mentre salvi, salva il tuo file xml, un'altra istanza del programma sta scrivendo allo stesso tempo. Questo corromperà il file, perché due scrittori possono fare abbastanza casino.

Anche se il tuo caso d'uso non punta a questa situazione, vale comunque la pena di essere protetto.

Questo è facilmente risolvibile usando il blocco dei file. Un blocco di scrittura esclusivo salverà questo per te. Nessuno può leggere il file e solo tu puoi scriverlo. O devi aspettare sull'altro programma.

L'ultima cosa che puoi fare è creare un file pid (file id processo) per il tuo programma, ma non penso che sia necessario qui. Quindi, se si esegue un'istanza diversa, è possibile verificare che un'altra istanza sia in esecuzione e quindi passa in una modalità di attesa finché il file PID non viene reso disponibile. Puoi bloccare il file pid come sopra, ma poi con un blocco condiviso. Se il programma si blocca, puoi ucciderlo facilmente leggendo il file pid e uccidere il processo.

In pseudocode fai questo:

if(lock_file(pidfile)){
     write_process_id(pidfile)
     run_program()
     unlock_file(pidfile)
}

Log4net

Come accennato qui, log4net non può eseguire scritture concorrenti su un singolo file di registro:

log4net-can-2-applications-write -to-the-same-log-file di

    
risposta data 14.08.2013 - 22:39
fonte
0

Il tuo codice sarà sicuro per i thread poiché è in esecuzione in diverse istanze di processo.

A che cosa devi fare attenzione con il log-in. Assicurati che le varie istanze non provino a creare file di registro con lo stesso nome, altrimenti avrai problemi.

    
risposta data 14.08.2013 - 16:55
fonte
0

Ogni istanza della tua applicazione verrà caricata nel proprio dominio dell'applicazione.
Saranno separati gli uni dagli altri.
È possibile trovare ulteriori informazioni sui domini dell'applicazione su MSDN - Domini delle applicazioni (Programmazione C # Guida)

Se si ha a che fare con una risorsa bloccabile che ottiene un blocco all'avvio dell'operazione e rilascia un blocco al termine dell'operazione (su SO o sul livello dell'applicazione), è necessario disporre di un singolo punto di accesso.
Non puoi utilizzare modello singleton qui perché ogni istanza della tua applicazione verrà caricata nel proprio dominio dell'applicazione e Singleton ha Ambito AppDomain. ok?

Quindi, se non puoi usare singleton, cosa puoi fare?

Bene, puoi creare un'altra applicazione per comunicare con le risorse bloccabili e tutte le comunicazioni tra l'applicazione (più istanze della tua applicazione) e le risorse bloccabili devono passare attraverso quell'applicazione.

    
risposta data 14.08.2013 - 16:54
fonte

Leggi altre domande sui tag