Question

J'ai écrit un beau scénario multithread, et quand je l'ai couru, il a performé moins bien avec 25 fils de discussion que l'invocation juste directe du gestionnaire de fil.

Je découvre le verrou de l'interpréteur global. Je veux demander, avant de défausse python pour ce script et réécrire la chose dans autre chose, est-il possible de faire travailler réelle multithreading en python?

Était-ce utile?

La solution

L'autre approche consiste à abandonner fils et au lieu d'utiliser le module multitraitement (Python 2.6 +), qui contourne la GIL, et a une API qui est au moins équivalente à celle du module de filetage.

Autres conseils

Maintenant, c'est une question intéressante -. Je ne pense pas qu'il y ait d'échapper à la GIL en CPython droite

Stackless Python est censé avoir amélioré la performance de "concurrence" sur CPython avec son utilisation de microfiletages , mais je pense que ce Dont't échappe à la GIL.

En outre, selon la la page GIL sur python.org , Jython et IronPython ne le font pas un GIL.

La réponse dépend fortement de ce que vous faites.

très lié au processeur (et le blocage IO-liés), des tâches comme la compression et le rendu d'image, sont généralement fait avec du code natif, et les bibliothèques natives libérer normalement le GIL pendant qu'ils travaillent, ce qui permet à la concurrence. Lorsque vous pouvez isoler le travail de CPU-intensive à un appel natif étroit, vous obtenez la concurrence, la performance native où il compte, et la commodité d'écriture la plupart du code en Python.

Pas tout le code a ces petits blocs isolables de code de calcul qui peut être parfaitement mis en œuvre dans une bibliothèque native, mais beaucoup faire.

Dans CPython (la mise en œuvre de Python en C), non, à ma connaissance. (Si je me trompe, s'il vous plaît me corriger, je voudrais bien savoir si une solution existe!).

Vous pouvez être intéressé par IronPython (.NET) ou JPython (Java / JWM). Je ne les ai pas utilisé, mais je crois au moins un d'entre eux prend en charge les threads natifs de l'environnement d'exécution donné.

Vous pouvez essayer le module multitraitement , si elle est applicable à votre problème.

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