Python multithreading e utilizzo di processori moderni - qual è il rovescio della medaglia?

3

CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.
-> threading

multiprocessing is a package that supports spawning processes using an API similar to the threading module.
-> multiprocessing

Tutti i processori PC moderni sono multicore. Quali sono gli svantaggi della generazione di nuovi processi, invece dei thread? Se non sono abbastanza significativi, perché esiste ancora il modulo di threading?

    
posta Vorac 12.09.2013 - 14:53
fonte

1 risposta

3

tl; dr

    I thread
  • sono rapidi, economici e leggeri in linea di principio, ma ottenere tutti e 3 senza sacrificare la sicurezza è un compito arduo
  • I processi
  • sono più lenti, costosi e pesanti in linea di principio, ma in pratica sono molto più facili da utilizzare spesso non importa

I thread esistono dentro un processo, condividendo uno spazio di indirizzi comune.

Professionisti della discussione:

  • generalmente è più economico (nel tempo e nella memoria) creare un thread piuttosto che biforcare un nuovo processo, perché qualsiasi overhead di conservazione del libro che il sistema operativo conserva per processo (ad esempio tabelle di pagina, tabelle dei descrittori di file, voce della tabella di processo) esiste già e non deve essere copiato
  • la comunicazione inter-thread è gratuita nel senso che non devi inviare cose attraverso un socket o altra interfaccia del kernel, quindi è veloce

Thread cons:

  • la comunicazione inter-thread è gratuita nel senso che non è regolamentata, quindi è molto facile causare dati razziali, deadlock e livelock. Ciò significa che devi elaborare con attenzione un certo regime di sincronizzazione per la tua applicazione, che può facilmente consumare tutti i vantaggi nozionali della condivisione dello spazio degli indirizzi: il GIL è un esempio calzante.

  • perché il tuo sistema operativo probabilmente gestisce le risorse a livello di processo, un'operazione fatale in un thread uccide l'intero processo

I processi sono isolati gli uni dagli altri, con spazi di indirizzi indipendenti e risorse del sistema operativo.

Process cons:

  • in genere è più costoso eseguire il fork di un nuovo processo piuttosto che creare un nuovo thread
  • la comunicazione tra processi (IPC) è relativamente costosa, poiché generalmente è necessario un meccanismo del kernel per copiare i dati da un processo all'altro

Professionisti di processo:

  • IPC tramite il kernel significa che non hai condizioni di gara e che non esiste alcuna sincronizzazione per progettare, implementare, testare e applicare. La semplicità spesso vale più della velocità (e della complessità) nozionale dell'accesso senza copia con i thread.
  • perché i processi sono isolati, non si può uccidere accidentalmente un altro (tranne inviando esplicitamente un segnale) o danneggiare la memoria di un altro processo
risposta data 12.09.2013 - 16:43
fonte

Leggi altre domande sui tag