Question

Fiable codeur ami m'a dit que Python actuelle du multi-threading mise en œuvre est sérieusement buggy - assez pour éviter d'utiliser complètement.Ce qui peut dire à propos de cette rumeur?

Était-ce utile?

La solution

Python threads sont bons pour e/S simultanées de programmation.Les Threads sont permutées de la CPU dès qu'ils le bloc d'attente pour l'entrée à partir d'un fichier, réseau, etc.Cela permet à d'autres threads Python pour utiliser le CPU alors que d'autres attendent.Cela vous permettra d'écrire un multi-thread serveur web ou web crawler, par exemple.

Cependant, Python threads sont sérialisés par le GIL quand ils entrent à l'interprète de base.Cela signifie que si deux threads sont à croquer des nombres, que l'on peut s'exécuter à un moment donné.Cela signifie également que vous ne pouvez pas profiter de multi-core ou multi-architectures de processeur.

Il existe des solutions comme l'exécution de plusieurs interpréteurs Python simultanément, à l'aide d'une C à base d'enfilage de la bibliothèque.Ce n'est pas pour les faibles de cœur et les avantages pourraient ne pas être en vaut la peine.Espérons que pour un Python solution dans une version future.

Autres conseils

L'implémentation standard de Python (généralement connu comme Disponible comme il est écrit en C) utilise des threads OS, mais comme il est le Mondial Interprète De Verrouillage, un seul thread à la fois est autorisé à exécuter du code Python.Mais l'intérieur de ces limites, les bibliothèques de threading sont robustes et largement utilisé.

Si vous voulez être en mesure d'utiliser plusieurs cœurs de PROCESSEUR, il ya quelques options.L'une consiste à utiliser plusieurs interpréteurs python simultanément, comme mentionné par d'autres.Une autre option est d'utiliser une mise en œuvre différente de Python qui n'utilise pas de GIL.Les deux principales options sont Jython et IronPython.

Jython est écrit en Java, et est maintenant assez mature, bien que certaines incompatibilités rester.Par exemple, le framework web Django ne fonctionne pas encore parfaitement, mais se rapproche tout le temps.Jython est idéal pour la sécurité des threads, qui vient de sortir mieux dans les benchmarks et a un effronté message pour ceux qui veulent l'GIL.

IronPython utilise le .NET framework et est écrit en C#.La compatibilité est arrivée au stade où Django peut s'exécuter sur IronPython (au moins comme une démonstration) et il y a des guides à l'aide de threads dans IronPython.

Le GIL (Global Interprète de Verrouillage) pourrait être un problème, mais l'API est tout à fait OK.Essayez l'excellent processing module qui implémente le Filetage API pour des processus distincts.Je l'utilise en ce moment (bien que sur OS X, ont encore à faire quelques tests sur Windows) et je suis vraiment impressionné.La classe de File d'attente est vraiment sauver ma bacon en termes de gestion de la complexité!

MODIFIER:il semble que le module de traitement est inclus dans la bibliothèque standard de la version 2.6 (import multiprocessing).De la joie!

Autant que je sache, il n'y a pas de vrais bugs, mais la performance lors de l'enfilage dans disponible est vraiment mauvais (par rapport à la plupart des autres threading implémentations, mais généralement assez bon si tous les la plupart des threads n'est bloc) en raison de la GIL (Global Interprète de Verrouillage), donc c'est vraiment la mise en œuvre spécifique plutôt que spécifique à une langue.Jython, par exemple, ne souffre pas de cette grâce à l'utilisation du Java modèle de thread.

Voir cette post sur pourquoi il n'est pas vraiment possible de supprimer le GIL disponible à partir de la mise en œuvre, et cette pour certaines pratiques d'élaboration et de solutions de contournement.

Faisons un rapide google pour "Python GIL" pour plus d'informations.

Si vous souhaitez coder en python et une grande charge des threads, vous pourriez vouloir vérifier IronPython ou Jython.Depuis le code python dans IronPython et Jython exécuter sur le .NET CLR et de la machine virtuelle Java, respectivement, ils jouissent d'une grande filetage prise en charge intégrée dans ces bibliothèques.En plus de cela, IronPython n'a pas le GIL, un problème qui empêche Disponible threads de tirer pleinement parti des architectures multicœurs.

Je l'ai utilisé dans plusieurs applications et n'ont jamais eu ni entendu d'enfiler autre chose que 100% fiable, aussi longtemps que vous savez ses limites.Vous ne pouvez pas frayer 1000 threads en même temps et attendre de votre programme de s'exécuter correctement sur Windows, cependant, vous pouvez facilement écrire un travailleur de la piscine et juste le nourrir 1000 opérations, et de garder tout gentil et sous contrôle.

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