tipo realizar qué que puedo puedes puede programar porque popular mejor mas hacer dificil desarrollar con aplicaciones java python multithreading jvm gil

qué - que se puede realizar en java



¿Por qué no hay GIL en la Máquina Virtual Java? ¿Por qué Python necesita uno tan malo? (5)

En este link tienen la siguiente explicación:

... "Partes del intérprete no son seguras, aunque principalmente porque hacer que todas sean seguras mediante el uso de bloqueos masivos ralentizaría extremadamente un único subproceso ( source ). Esto parece estar relacionado con el recolector de basura CPython que utiliza el recuento de referencias (la JVM y CLR no, y por lo tanto no es necesario bloquear / liberar un recuento de referencia cada vez). Pero incluso si alguien pensó en una solución aceptable y la implementó, las bibliotecas de terceros todavía tendrían los mismos problemas ".

Espero que alguien pueda darnos una idea de lo que es fundamentalmente diferente de la Máquina Virtual Java que le permite implementar hilos muy bien sin la necesidad de un bloqueo de intérprete global (GIL), mientras que Python necesita un mal tan grande.


Hay un comentario más abajo en esta publicación de blog http://www.grouplens.org/node/244 que insinúa la razón por la cual fue tan fácil prescindir de un GIL para IronPython o Jython, es que CPython usa el recuento de referencias mientras que las otras 2 máquinas virtuales tienen recolectores de basura.

La mecánica exacta de por qué esto es así no lo entiendo, pero suena como una razón plausible.


La JVM (al menos punto de acceso) tiene un concepto similar al "GIL", es mucho más fino en su granularidad de bloqueo, la mayor parte de esto proviene de los GC''s en el punto de acceso que son más avanzados.

En CPython es un gran bloqueo (probablemente no tan cierto, pero lo suficientemente bueno como argumento), en la JVM está más extendido con diferentes conceptos según dónde se use.

Eche un vistazo, por ejemplo, a vm / runtime / safepoint.hpp en el código del punto de acceso, que es efectivamente una barrera. Una vez en un punto seguro, toda la máquina virtual se detuvo con respecto al código de Java, al igual que la máquina virtual de python se detiene en el GIL.

En el mundo de Java, tales eventos de pausa de VM se conocen como "detener el mundo", en estos puntos solo el código nativo que está sujeto a ciertos criterios se ejecuta de manera gratuita, el resto de la VM se ha detenido.

Además, la falta de un bloqueo aproximado en Java hace que JNI sea mucho más difícil de escribir, ya que la JVM brinda menos garantías sobre su entorno para llamadas FFI, una de las cosas que cpython hace bastante fácil (aunque no tan fácil como usar ctypes).


Python (el lenguaje) no necesita un GIL (por lo que puede implementarse perfectamente en JVM [Jython] y .NET [IronPython], y esas implementaciones se procesan de forma múltiple). CPython (la popular implementación) siempre ha usado un GIL para facilitar la codificación (especialmente la codificación de los mecanismos de recolección de basura) y la integración de librerías con codificación C no filiformes (solía haber un montón de ésas alrededor; -).

El proyecto Unladen Swallow , entre otros objetivos ambiciosos, plan una máquina virtual libre de GIL para Python, para citar ese sitio, "Además, tenemos la intención de eliminar el GIL y arreglar el estado del multihilo en Python. Creemos que esto es posible a través de la implementación de un sistema GC más sofisticado, algo así como Recycler de IBM (Bacon et al, 2001) ".


Python carece de jit / aot y el marco de tiempo en el que se escribió en los procesadores multiproceso no existía. Alternativamente, podrías recompilar todo en Julia Lang, que carece de GIL y obtener un impulso de velocidad en tu código de Python. También Jython chupa es más lento que Cpython y Java. Si quiere apegarse a Python, considere usar complementos paralelos, no obtendrá un aumento de velocidad instantáneo, pero puede hacer una programación paralela con el complemento correcto.