Pregunta

Estoy esperando que alguien puede proporcionar una idea de por lo que es fundamentalmente diferente de la máquina virtual de Java que le permite implementar los hilos bien sin la necesidad de un intérprete bloqueo global (GIL), mientras que Python necesita un mal ejemplo.

¿Fue útil?

Solución

Python (el lenguaje) no necesita una GIL (por lo que perfectamente puede ser implementado en JVM [Jython] y .NET [IronPython], y esas implementaciones multi-hilo libremente). CPython (la implementación popular) siempre ha utilizado una GIL para la facilidad de la codificación y de la integración de bibliotecas de C-codificados no compatibles con el proceso (que solía haber una tonelada de aquellos a su alrededor (especialmente la codificación de los mecanismos de recolección de basura.); -.)

El proyecto trago des , entre otras metas ambiciosas, lo hace plan de una máquina virtual GIL-libre para Python - para citar a ese sitio, "Además , tenemos la intención de quitar el GIL y fijar el estado de múltiples hilos en Python. Creemos que esto es posible a través de la implementación de un sistema de GC más sofisticado, algo así como reciclador de IBM (bacon et al, 2001). "

Otros consejos

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

En CPython Es un gran bloqueo (probablemente no es cierto, pero lo suficientemente bueno para el bien de los argumentos), en la JVM es más la voz acerca de los conceptos con diferentes dependiendo de donde se utiliza.

Tome un vistazo a, por ejemplo, vm / runtime / safepoint.hpp en el código de punto de acceso, que es efectivamente una barrera. Una vez en un punto seguro todo el VM se ha detenido en relación con el código de Java, al igual que el pitón VM se detiene en la GIL.

En el mundo Java tales eventos Pausa de VM se conocen como "stop-el-mundo", en estos puntos único código nativo que se une a ciertos criterios se marcha libre, el resto de la máquina virtual se ha detenido.

Además, la falta de una cerradura gruesa en Java hace JNI mucho más difícil de escribir, ya que la JVM hace menos garantías sobre su entorno para FFI llama, una de las cosas que CPython hace bastante fácil (aunque no es tan fácil como usar ctypes ).

No es un comentario más abajo en esta entrada de blog http://www.grouplens.org/node/ 244 que insinúa la razón por la que era tan fácil prescindir de un GIL para IronPython o Jython, es que CPython utiliza el recuento de referencias, mientras que los otros 2 máquinas virtuales tienen los recolectores de basura.

Los mecanismos exactos de por qué esto es así que no entiendo, pero sí suena como una razón plausible.

En este tienen la siguiente explicación:

... "Partes de la intérprete no están protegidas por hebras, aunque sobre todo porque, al hacer a todos ellos multi-hilo por el uso masivo de bloqueo frenaría extremadamente único subproceso ( fuente ). Esto parece estar relacionado con el recolector de basura CPython utilizando el recuento de referencias (la JVM y CLR no lo hacen, y por lo tanto no es necesario para bloquear / liberar un recuento de referencia cada vez). Pero incluso si alguien se le ocurrió una solución aceptable y la implementó, bibliotecas de terceros todavía tendrían los mismos problemas. "

Python carece de JIT / AOT y enmarcar el momento en que fue escrito en procesadores multihilo no existían. Como alternativa puede volver a compilar todo en Julia Lang que carece de Gil y ganar un poco de aumento de velocidad en su código Python. También Jython tipo de chupa es más lento que CPython y Java. Si usted quiere meter a Python considerar el uso de plugins paralelas, no se ganará una mejora en la velocidad instantánea pero se puede hacer la programación en paralelo con el plugin adecuado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top