Domanda

Come decidere se utilizzare i thread o creare un processo completamente separato nella tua applicazione per ottenere il parallelismo.

È stato utile?

Soluzione

I thread sono più leggeri e per creare diversi "lavoratori" solo per utilizzare tutte le CPU o i core disponibili, è meglio con i thread.

Quando hai bisogno che i lavoratori siano meglio isolati e più robusti, come con la maggior parte dei server, scegli i socket.Quando un thread si blocca gravemente, di solito blocca l'intero processo, inclusi gli altri thread che lavorano in quel processo.Se un processo si inasprisce e muore, non tocca nessun altro processo, quindi possono tranquillamente andare avanti con i loro affari come se nulla fosse successo.

Altri suggerimenti

I processi hanno una memoria più isolata.Questo è importante per una serie di motivi:

  • È più difficile che una singola attività blocchi le altre attività.
  • Sarà disponibile più memoria per ogni processo.Questo è importante per applicazioni di grandi dimensioni e ad alte prestazioni come Apache o server di database, come Postgres.Ciò è importante sia per la memoria allocata che per i file mappati in memoria.

Il grado di parallelismo dipende principalmente dai processori/core fisici disponibili sulla tua macchina.Se disponi di una macchina con processore singolo/core, avere processi separati potrebbe causare un sovraccarico eccessivo.In questo caso, in genere, sarebbero preferibili i thread.

Se disponi di più core/CPU, a seconda di ciò che fa ciascun processo/thread, puoi optare per i processi se il sovraccarico è giustificato.I processi ovviamente hanno un livello di isolamento della memoria molto migliore rispetto ai thread, ma allo stesso tempo in Windows i processi sono piuttosto pesanti rispetto ai thread.

I thread ovviamente possono condividere i dati nello stesso processo, ma anche in questo caso sarebbe necessario sincronizzare l'accesso ai dati condivisi per evitare uno stato corrotto.La condivisione dei dati tra processi è più complessa, il sovraccarico (che è maggiore rispetto alla semplice sincronizzazione dei thread) dipende dai meccanismi utilizzati come pipe denominate, comunicazione basata su socket personalizzati, utilizzo di un framework remoto, file/database condivisi, ecc.

In genere è necessario utilizzare i processi quando i singoli flussi di esecuzione non necessitano di condividere dati globali e si desidera che ciascuno sia protetto dall'altro.

In Windows, i processi sono più pesanti da creare rispetto ai thread.Quindi, se hai diverse attività più piccole, un thread o un pool di thread sarebbe meglio.Oppure utilizzare un pool di processi per riciclare i processi.Anche la condivisione dello stato tra i processi richiede più lavoro rispetto alla condivisione dello stato tra i thread.Ma poi ancora:I thread potrebbero destabilizzare un processo completo portando con sé altri thread.Se vuoi ridurre al minimo la possibilità che ciò accada, potresti optare per processi separati.Gli AppDomain di .Net potrebbero essere una via di mezzo tra i due.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top