Domanda

Sto sperando che qualcuno possa fornire alcune informazioni su quanto c'è di fondamentalmente diverso sulla Java Virtual Machine che permette di implementare le discussioni bene senza la necessità di un Global Interpreter Lock (GIL), mentre Python necessita di un tale male.

È stato utile?

Soluzione

Python (la lingua) non ha bisogno di un GIL (che è per questo che può perfettamente essere implementato su JVM [Jython] e .NET [IronPython], e quelle implementazioni multithread liberamente). CPython (l'attuazione popolare) ha sempre utilizzato un GIL per la facilità di codifica e di integrazione delle librerie C-coded non-thread-safe (Ci deve essere utilizzato una tonnellata di quelli intorno (esp la codifica dei meccanismi di raccolta dei rifiuti.); -).

Il progetto vuoto Rondine , tra gli altri obiettivi ambiziosi, fa piano una macchina virtuale GIL-libera per Python - per citare quel sito, "In aggiunta , abbiamo intenzione di rimuovere il GIL e fissare lo stato di multithreading in Python. crediamo che questo è possibile attraverso l'implementazione di un sistema di GC più sofisticato, qualcosa come Recycler di IBM (Bacone et al, 2001). "

Altri suggerimenti

La JVM (almeno hotspot) ha un concetto simile al "GIL", è solo molto più sottile nella sua granularità serratura, la maggior parte di questo viene dal GC in hotspot che sono più avanzati.

In CPython Si tratta di un grande blocco (probabilmente non è vero, ma abbastanza buono per amor di argomenti), nella JVM è più diffusa in giro con concetti diversi a seconda di dove viene utilizzato.

Date un'occhiata a, per esempio, vm / runtime / safepoint.hpp nel codice hotspot, che è effettivamente una barriera. Una volta in un safepoint l'intera VM si è fermato per quanto riguarda il codice Java, proprio come il pitone VM si ferma al GIL.

Nel mondo Java tali eventi Esecuzione dei VM sono noti come "stop-the-world", in questi punti solo codice nativo che è destinata a determinati criteri è free running, il resto della VM è stato arrestato.

Anche la mancanza di una serratura grossolana in Java rende JNI molto più difficile da scrivere, come la JVM rende meno garanzie circa il suo ambiente per la FFI chiama, una delle cose che CPython rende abbastanza facile (anche se non facile come usare ctypes ).

Non è un commento in basso in questo post del blog http://www.grouplens.org/node/ 244 che allude il motivo era così facile erogazione con una GIL per IronPython o Jython, è che CPython utilizza il conteggio di riferimento mentre gli altri 2 VM ha netturbini.

La meccanica esatte di questo è il motivo per cui così non si ottiene, ma non suona come una ragione plausibile.

In questo hanno la seguente spiegazione:

... "Parti l'interprete non sono threadsafe, ma soprattutto perché rendendoli tutti threadsafe dall'uso serratura massiccia rallenterebbe a thread singolo estremamente ( fonte ). Questo sembra essere correlato al garbage collector CPython utilizzando il conteggio dei riferimenti (il JVM e CLR non lo fanno, e quindi non hanno bisogno di blocco / sblocco conta un riferimento ogni volta). Ma anche se qualcuno ha pensato di una soluzione accettabile e implementato, librerie di terze parti sarebbero ancora gli stessi problemi ".

Python manca JIT / AOT e inquadrare il tempo è stato scritto a processori multithreaded non esisteva. In alternativa si potrebbe ricompilare tutto in Julia lang che manca GIL e guadagnare un po 'aumento di velocità sul vostro codice Python. Anche Jython tipo di fa schifo è più lento di CPython e Java. Se si vuole attaccare a Python considerare l'utilizzo di plug-in parallelo, non si otterrà una spinta velocità istantanea ma si può fare programmazione parallela con il plugin destra.

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