Come posso sapere se sto sfruttando troppo il multi-threading?

15

Attualmente mi sento come se stessi usando troppo il multi-threading.

Ho 3 tipi di dati, A, B e C.

Ogni A può essere convertito in più B s e ogni B può essere convertito in più C s.

Mi interessa solo trattare C s.

Potrei scriverlo abbastanza facilmente con un paio di funzioni di conversione. Ma mi sono sorpreso a implementarlo con thread, tre code ( queue_a , queue_b e queue_c ). Esistono due thread che eseguono le diverse conversioni e un worker:

  • ConverterA legge da queue_a e scrive in queue_b
  • ConverterB legge da queue_b e scrive in queue_c
  • Worker gestisce ogni elemento da queue_c

Le conversioni sono abbastanza banali, e non so se questo modello è troppo complicato. Ma mi sembra estremamente robusto. Ogni "convertitore" può iniziare a funzionare anche prima che i dati arrivino sulle code, e in qualsiasi momento nel codice posso solo "inviare" nuovo A s o B s e attiverà la pipeline di conversione che a sua volta attivare un lavoro dal thread di lavoro.

Anche il codice risultante sembra più semplice. Ma non sono ancora sicuro se sto abusando dei thread per qualcosa di semplice.

    
posta exhuma 06.11.2013 - 14:25
fonte

1 risposta

16

È quasi sempre più semplice pensare in sequenza, e successivamente modificare quella logica per lavorare meglio usando i thread. E, come dice l'espressione, "Se non è rotto, non aggiustarlo." La maggior parte dei programmatori non usa thread semplicemente perché non c'è bisogno di usarli.

Se ti senti più a tuo agio nell'usarli, più potere per te. Tuttavia, sappi che se i thread non offrono un aumento di velocità eliminando i colli di bottiglia, stanno quasi certamente rallentando il tuo programma.

Considera inoltre che i sistemi che dedicano solo una CPU a un processo simuleranno più thread di un singolo thread per risparmiare risorse (questo non accade spesso con i computer moderni, anche se le applicazioni smart phone sono ancora molto soggette a questo abuso ). In questo caso, anche se stai eliminando i colli di bottiglia attraverso l'uso dei thread, sarà più lento che se non hai usato affatto i thread.

E, forse la ragione più sottile per usare cautela nell'uso dei thread, ma certamente non il meno importante, i thread hanno la tendenza a fare ciò che non ti aspetti. Sì, se stai prendendo precauzioni, dovresti stare bene. Sì, se i tuoi thread non scrivono su variabili condivise tra thread, dovresti essere a posto. Detto questo, i bug relativi ai thread sono molto difficili da trovare. Dal momento che sono dell'idea che un programmatore non può mai eliminare completamente la possibilità di creare bug nel codice e quindi un programmatore dovrebbe adottare misure per proteggersi da possibili bug piuttosto che concentrarsi su eliminarli completamente, si dovrebbe assolutamente applicare questa idea a hard- trovare i bug del thread pure. In altre parole, sappi che, nonostante i tuoi migliori sforzi, l'uso di thread nel codice creerà quasi certamente alcuni bug molto seri prima o poi che non avresti altrimenti senza utilizzare i thread.

Quindi dovresti usare i thread comunque? Bene, una buona conoscenza dei thread non è certamente una brutta cosa, specialmente se diventi bravo a farlo. Tuttavia, il movimento di ritardo è stato verso linguaggi a thread singolo come node.js. Uno dei principali vantaggi di avere un singolo thread è che è facile scalare e determinate ottimizzazioni possono essere fatte se si sa che le istruzioni dovrebbero essere eseguite in sequenza (anche se le ottimizzazioni possono significare che le istruzioni che possono essere eseguite in parallelo possono essere eseguito in modo asincrono).

Detto questo, dico di fare ciò che è più comodo per te. Nella mia esperienza, scrivere un programma che hai capito ha una priorità più alta che farlo funzionare più velocemente. Assicurati di usare i thread solo quando pensi che ti aiuti a scrivere il programma, e non perché vuoi che funzioni più velocemente, dato che non dovresti preoccuparti troppo delle prestazioni mentre stai scrivendo il programma (l'ottimizzazione è importante, ma può anche attendere).

    
risposta data 06.11.2013 - 15:33
fonte

Leggi altre domande sui tag