Domanda

Un amico programmatore affidabile mi ha detto che l'attuale implementazione multi-threading di Python è seriamente difettosa, abbastanza da evitarne del tutto l'uso.Cosa si può dire di questa voce?

È stato utile?

Soluzione

I thread Python sono utili per programmazione I/O simultanea.I thread vengono scambiati fuori dalla CPU non appena si bloccano in attesa di input da file, rete, ecc.Ciò consente ad altri thread Python di utilizzare la CPU mentre altri aspettano.Ciò consentirebbe, ad esempio, di scrivere un server Web multi-thread o un web crawler.

Tuttavia, i thread Python vengono serializzati da GIL quando entrano nel nucleo dell'interprete.Ciò significa che se due thread stanno elaborando numeri, solo uno può essere eseguito in un dato momento.Significa anche che non è possibile sfruttare architetture multi-core o multiprocessore.

Esistono soluzioni come l'esecuzione simultanea di più interpreti Python, utilizzando una libreria di threading basata su C.Questo non è per i deboli di cuore e i benefici potrebbero non valere la pena.Speriamo in una soluzione tutta Python in una versione futura.

Altri suggerimenti

L'implementazione standard di Python (generalmente nota come CPython poiché è scritta in C) utilizza i thread del sistema operativo, ma poiché esiste il Blocco interprete globale, solo un thread alla volta può eseguire il codice Python.Ma entro questi limiti, le librerie di threading sono robuste e ampiamente utilizzate.

Se vuoi essere in grado di utilizzare più core della CPU, ci sono alcune opzioni.Uno è utilizzare più interpreti Python contemporaneamente, come menzionato da altri.Un'altra opzione è utilizzare un'implementazione diversa di Python che non utilizzi GIL.Le due opzioni principali sono Jython E IronPython.

Jython è scritto in Java ed è ora abbastanza maturo, sebbene permangano alcune incompatibilità.Ad esempio, il framework web Django non funziona ancora perfettamente, ma si avvicina sempre di più.Jython lo è ottimo per la sicurezza del filo, viene fuori meglio nei benchmark e ha un messaggio sfacciato per coloro che vogliono il GIL.

IronPython utilizza il framework .NET ed è scritto in C#.La compatibilità sta raggiungendo la fase in cui Django può essere eseguito su IronPython (almeno come demo) e ci sono guide all'utilizzo dei thread in IronPython.

Il GIL (Global Interpreter Lock) potrebbe essere un problema, ma l'API è abbastanza OK.Prova l'eccellente processing modulo, che implementa l'API Threading per processi separati.Lo sto usando proprio adesso (anche se su OS X, devo ancora fare alcuni test su Windows) e sono davvero impressionato.La classe Queue mi sta davvero salvando il bacon in termini di gestione della complessità!

MODIFICARE:sembra che il modulo di elaborazione sia incluso nella libreria standard a partire dalla versione 2.6 (import multiprocessing).Gioia!

Per quanto ne so non ci sono veri bug, ma le prestazioni durante il threading in cPython sono davvero pessime (rispetto alla maggior parte delle altre implementazioni di threading, ma di solito abbastanza buone se la maggior parte dei thread non fa altro che bloccarsi) a causa del GIL (Global Interpreter Lock), quindi in realtà è specifico dell'implementazione piuttosto che della lingua.Jython, ad esempio, non ne soffre grazie all'utilizzo del modello thread Java.

Vedere Questo pubblica sul motivo per cui non è realmente possibile rimuovere GIL dall'implementazione cPython e Questo per alcune elaborazioni pratiche e soluzioni alternative.

Fai una rapida ricerca su Google "Pitone GIL" per maggiori informazioni.

Se vuoi codificare in Python e ottenere un ottimo supporto per il threading, potresti dare un'occhiata a IronPython o Jython.Poiché il codice Python in IronPython e Jython viene eseguito rispettivamente su .NET CLR e Java VM, godono dell'ottimo supporto del threading integrato in tali librerie.In aggiunta a ciò, IronPython non ha GIL, un problema che impedisce ai thread CPython di sfruttare appieno le architetture multi-core.

L'ho usato in diverse applicazioni e non ho mai avuto né sentito parlare di threading che non sia affidabile al 100%, purché se ne conoscano i limiti.Non puoi generare 1000 thread contemporaneamente e aspettarti che il tuo programma funzioni correttamente su Windows, tuttavia puoi facilmente scrivere un pool di lavoratori e alimentarlo con 1000 operazioni e mantenere tutto sotto controllo.

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