Question

Est-ce que quelqu'un connaît le sort de Global Interpreter Lock dans Python 3.1 contre l'intégration multithreading C ++

Était-ce utile?

La solution

GIL est toujours là dans CPython 3.1; les projets Unladen Swallow ont pour objectif (parmi de nombreux autres avantages en matière de performances) de les supprimer, mais cela reste un chemin à partir de ses objectifs, et travaille d’abord sur la version 2.6 dans l’intention de porter finalement en 3.x quelle que soit la version actuelle de x à la date à laquelle la version 2.y est considérée comme terminée. Pour le moment, le multitraitement (au lieu de thread) reste le choix privilégié pour utiliser plusieurs cœurs dans CPython (IronPython et Jython conviennent également, mais ils ne prennent pas en charge Python 3 pour le moment et ne facilitent pas non plus l'intégration en C ++; - ).

Autres conseils

Des modifications importantes se produiront dans le fichier GIL pour Python 3.2. Jetez un coup d’œil à la Quoi de neuf pour Python 3.2 , et le fil qui l'a lancé dans la liste de diffusion .

Les changements ne signifient pas la fin du GIL, mais ils annoncent des gains de performances potentiellement énormes.

Update0

  • Les gains de performance généraux avec la nouvelle GIL dans la version 3.2 d'Antoine Pitrou étaient négligeables et visaient plutôt à résoudre les problèmes de conflit qui se produisent dans certains cas.
  • Un effort admirable de David Beazley a été mis en œuvre pour implémenter un planificateur afin d'améliorer considérablement les performances lorsque le processeur et les E / S les fils liés sont mélangés, ce qui a malheureusement été abattu.
  • Le travail Unladen Swallow a été proposé pour la fusion dans Python 3.3, mais ceci a été retiré en raison du manque de résultats dans ce projet. PyPy est maintenant le projet préféré et est actuellement demande de financement pour ajouter le support Python3k. Il est très peu probable que PyPy devienne la valeur par défaut à l’heure actuelle.

Des efforts ont été déployés au cours des 15 dernières années pour supprimer le GIL de CPython, mais il est là pour rester dans un avenir prévisible.

Le GIL n'affectera pas votre code qui n'utilise pas d'objets Python. Dans Numpy, nous publions la GIL pour le code de calcul (appels d'algèbre linéaire, etc.), et le code sous-jacent peut utiliser le multithreading librement (en fait, ce sont en général des bibliothèques tierces qui ne connaissent rien du python)

Le GIL est une bonne chose.

Faites que votre application C ++ publie la GIL pendant qu’elle effectue son travail multithread. Le code Python continuera à s'exécuter dans les autres threads, intact. N'acquérir le GIL que lorsque vous devez toucher des objets python.

Je suppose qu’il y aura toujours un GIL. La raison est la performance. Rendre tout le thread d'accès de bas niveau sûr - cela signifie qu'il est lourd de placer un mutex autour de chaque opération de hachage, etc. Rappelez-vous qu'une simple déclaration comme

self.foo(self.bar, 3, val)

Peut-être déjà avoir au moins 3 (si val est un global) des hachages consultables pour le moment et peut-être même beaucoup plus si le cache de méthode n'est pas chaud (en fonction de la profondeur d'héritage de la classe)

C’est cher - c’est pourquoi Java a abandonné l’idée et introduit des tables de hachage qui ne font pas appel à un appel à un moniteur pour se débarrasser de son "Java is Slow". marque déposée.

Si je comprends bien, le "brainfuck" le programmateur remplacera le GIL à partir de python 3.2

Planificateur BFS Bain de Buck

Si le GIL vous gêne, utilisez simplement le module multitraitement . . Il engendre de nouveaux processus, mais utilise le modèle de threading et (la plupart des) api. En d’autres termes, vous pouvez faire un parallélisme basé sur les processus d’une manière filaire.

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