Question

Nous sommes tous conscients de l'horreur de la GIL, et j'ai vu beaucoup de discussion sur le bon moment pour utiliser le multiprocessing module, mais je n'ai toujours pas l'impression que j'ai une bonne intuition lors de l'enfilage en Python (en se concentrant principalement sur Disponible) est la bonne réponse.

Quels sont les cas dans lesquels le GIL n'est pas un goulot d'étranglement important?Quels sont les types de cas d'utilisation où le filetage est la réponse la plus appropriée?

Était-ce utile?

La solution

Filetage vraiment n'a de sens que si vous avez beaucoup de blocage I/O pour aller sur.Si c'est le cas, alors certains fils peut dormir alors que les autres threads de travail.Si les threads sont lié au PROCESSEUR, vous n'êtes pas susceptible de voir beaucoup de bénéfices de multithreading.

Notez que l' multitraitement module, bien que plus difficile à code, rend l'utilisation de processus distincts et, par conséquent, de ne pas subir les inconvénients de la GIL.

Autres conseils

Puisque vous semblez être à la recherche d'exemples, voici quelques-uns sur le dessus de ma tête et attrapa de recherche pour le CPU et I/O-lié exemples (je n'arrive pas à trouver de nombreux).Je ne suis pas un expert, n'hésitez pas à corriger tout ce que j'ai miscategorized.Il est également intéressant de noter que l'avancement de la technologie pourrait déplacer un problème d'une catégorie à l'autre.

CPU des Tâches (utilisation multiprocessing)

  • Méthodes numériques/approximations de fonctions mathématiques (calcul des décimales de pi, etc.)
  • Le traitement de l'Image
  • L'exécution circonvolutions
  • Le calcul des transformations pour la programmation graphique (éventuellement géré par le GPU)
  • Audio/vidéo de compression/décompression

I/O Bound Tâches (threading est probablement OK)

  • L'envoi de données à travers un réseau
  • De l'écriture à/de lecture à partir du disque
  • Demander la saisie de l'utilisateur
  • Streaming Audio/vidéo

Le GIL empêche python à partir de l'exécution de plusieurs threads.

Si votre code publie le GIL avant de sauter dans un C extension, les autres threads python peut continuer alors que le C code s'exécute.Comme avec le blocage IO, que d'autres personnes l'ont mentionné.

Ctypes le fait automatiquement, et donc ne numpy.Donc, si votre code utilise beaucoup, il ne peut pas être restreint de façon significative par le GIL.

En plus de la CPU et I/O bound tâches, il y a encore plus de cas d'utilisation.Par exemple, le fil permet tâches simultanées.Beaucoup de programmation GUI entrent dans cette catégorie.La boucle principale doivent être sensibles aux événements de la souris.Si à tout moment vous avez une tâche qui prennent un certain temps et vous ne voulez pas de geler l'INTERFACE utilisateur, vous le faites sur un thread séparé.C'est moins sur la performance et plus sur le parallélisme.

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