Parlando di un esempio reale, ci sono diversi motivi per utilizzare il multi-threading, e io non assumerebbe uno sviluppatore web che non lo sa. Ma alla fine, i motivi per usare il multi-threading sono gli stessi per lo sviluppo standard e web: o vuoi qualcosa che richiede un po 'di tempo (anche in blocco) fatto in background per dare all'utente una risposta in mezzo, o tu avere un compito che può essere accelerato facendolo girare su più core. Quando il multi-threading è effettivamente utile è comunque una domanda diversa.
Situazione 1: un server Web che richiede una certa elaborazione e ha colpi bassi/secondo
Qui multi-threading (se applicabile per l'algoritmo) è una buona cosa, core come inattive vengono utilizzati e filettatura può comportare una risposta più rapida all'utente.
Situazione 2: un server Web che richiede una certa elaborazione e di elevata colpi/secondo
Qui multi-threading è possibile, ma come nuclei di solito sono occupati con altre richieste, non ci sono risorse a sinistra per usalo correttamente Effettivamente diffondere il compito di diversi fili possono anche avere un impatto negativo sul tempo di risposta, come il compito è ora frammentata e tutte le parti devono completare, ma l'ordine di esecuzione con fili è indefinito. Così un cliente potrebbe ricevere immediatamente una risposta, mentre altri potrebbero attendere il timeout fino a quando il loro ultimo frammento non viene elaborato.
Situazione 3: Un server web deve fare un po 'di elaborazione che richiede un tempo molto lungo è richiesto
Qui multi-threading, non c'è modo intorno ad esso. Un cliente non può attendere minuti o probabilmente ore prima di ricevere la risposta. In questo caso, solitamente viene implementato un sistema di callback, quindi in pratica ogni task ha una "API" che può essere interrogata per lo stato corrente. La maggior parte dei negozi online ne è un esempio: ordini qualcosa e in seguito puoi richiedere lo stato del tuo ordine.
L'alternativa di filettatura è processo fork, come Apache fa nella sua configurazione standard. Il vantaggio è che il carico si sviluppa su core (per lo più applicabile alla situazione 2), e il web-codice stesso non deve fare nulla di utilizzare tutte quelle core, come il sistema operativo gestisce che automaticamente. Tuttavia, se il carico è sbilanciato, alcuni core possono essere inattivi e le risorse non vengono utilizzate in modo ottimale. Una situazione di threading è quasi sempre la soluzione migliore, se è fatta bene. Ma la configurazione standard di Apache/Tomcat utilizza un modello di thread molto obsoleto, generando un thread per ogni richiesta. Effettivamente dato un certo numero di colpi al secondo, la CPU è più occupata con il threading che con l'elaborazione effettiva di quelle richieste.
IMHO, sei assolutamente corretto che il ruolo principale del multithreading nelle app Web sia gestire simultaneamente più richieste indipendenti e quindi rendere il server reattivo. – Ingo
Ad esempio, si dispone di una pagina di registrazione utente ed è necessario inviare la notifica e-mail dell'utente relativa alla registrazione. In questo caso possiamo usare il multithreading inviando email in thread separati. – Foolish
Sto usando il multi threading per l'analisi di xmls –