Pourquoi est-il pas GIL dans la machine virtuelle Java? Pourquoi Python avez besoin d'un si mauvais?

StackOverflow https://stackoverflow.com/questions/991904

Question

J'espère que quelqu'un peut donner un aperçu de ce qui est fondamentalement différent de la machine virtuelle Java qui permet de mettre en œuvre des fils bien sans la nécessité d'un interprète mondial Lock (GIL), alors que Python nécessite un tel mal.

Était-ce utile?

La solution

Python (la langue) n'a pas besoin de GIL (ce qui est la raison pour laquelle il peut parfaitement être mis en œuvre sur la JVM [Jython] et .NET [IronPython], et les implémentations multithread librement). CPython (la mise en œuvre populaire) a toujours utilisé un GIL pour faciliter le codage et l'intégration des non-thread-safe bibliothèques à code C (il y avait une tonne de ceux qui l'entourent (en particulier le codage des mécanismes de collecte des ordures.); -.)

Le projet de hirondel, entre autres objectifs ambitieux, fait Plan une machine virtuelle sans GIL pour Python - pour citer ce site, « En plus , nous avons l'intention d'enlever le GIL et fixer l'état de multithreading en Python. nous pensons que cela est possible grâce à la mise en œuvre d'un système de GC plus sophistiqué, quelque chose comme recycleur d'IBM (Bacon et al, 2001). "

Autres conseils

La machine virtuelle Java (au moins hotspot) a un concept similaire à la « GIL », il est juste beaucoup plus fine dans sa granularité de verrouillage, la plupart de cela vient du du GC en hotspot qui sont plus avancés.

En CPython il y a une grande écluse (probablement pas vrai, mais assez bon pour l'amour arguments), dans la machine virtuelle Java, il est plus répandirent avec des concepts différents selon l'endroit où il est utilisé.

Jetez un oeil à, par exemple, vm / exécution / safepoint.hpp dans le code de hotspot, qui est effectivement une barrière. Une fois à l'ensemble de VM point de restauration est arrêté en ce qui concerne le code java, un peu comme le python VM arrête au GIL.

Dans le monde Java tels événements faisant une pause VM sont connus comme « stop-the-world », à ces points que le code natif qui est lié à certains critères est en marche libre, le reste de la machine virtuelle a été arrêté.

En outre l'absence d'une serrure grossière java rend JNI beaucoup plus difficile à écrire, comme la machine virtuelle Java fait moins de garanties de son environnement pour les appels FFI, l'une des choses qui CPython rend assez facile (mais pas aussi facile que l'utilisation ctypes ).

Il y a un commentaire en bas dans ce billet de blog http://www.grouplens.org/node/ 244 qui laisse deviner la raison pour laquelle il était si facile se passer d'un GIL pour IronPython ou Jython, il est que CPython utilise le comptage de référence alors que les 2 autres machines virtuelles ont éboueurs.

La mécanique exacte de pourquoi cela est si je ne suis pas, mais il ne sonne comme une raison plausible.

Dans ce ils ont l'explication suivante:

... « Certaines parties de l'interprète ne sont pas threadsafe mais surtout parce que ce qui les rend tous threadsafe par l'utilisation de verrouillage massif ralentirait monothread extrêmement ( la source ). Cela semble être lié au collecteur des ordures CPython par comptage de référence ( JVM et CLR ne sont pas, et donc ne pas besoin de bloquer / débloquer compte à chaque fois une référence). Mais même si quelqu'un a pensé à une solution acceptable et mis en œuvre il, les bibliothèques de tiers auraient toujours les mêmes problèmes. "

Python manque JIT / AOT et le temps encadrez a été écrit à processeurs multithread n'existait pas. Sinon, vous pouvez recompiler tout Julia Lang qui manque GIL et acquérir une certaine augmentation de la vitesse sur votre code Python. Aussi Jython sorte de suce il est plus lent que CPython et Java. Si vous voulez coller à Python envisager d'utiliser des plugins parallèles, vous ne gagnerez pas un coup de pouce de vitesse instantanée, mais vous pouvez faire de la programmation parallèle avec le plug-in à droite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top