web-dev-qa-db-fra.com

Green-threads et thread dans Python

Comme Wikipédia déclare :

Les threads verts émulent des environnements multithreads sans compter sur des capacités de système d'exploitation natif, et ils sont gérés dans l'espace utilisateur au lieu de l'espace du noyau, ce qui leur permet de travailler dans des environnements qui ne prennent pas en charge les threads natifs.

Les threads de Python sont implémentés en tant que pthreads (kernel threads), et en raison du verrou d'interpréteur global (GIL), un processus Python n'exécute qu'un seul thread à la fois.

[ [~ # ~] question [~ # ~] ] Mais dans le cas de Green-threads (ou soi-disant greenlet ou tasklets),

  1. Les GIL les affectent-ils? Peut-il y avoir plus d'un greenlet à la fois?
  2. Quels sont les pièges de l'utilisation des greenlets ou des tasklets?
  3. Si j'utilise des greenlets, combien d'entre eux un processus peut-il gérer? (Je me demande parce que dans un seul processus, vous pouvez ouvrir des threads jusqu'à ulimit ( s, v) dans votre système * ix.)

J'ai besoin d'un peu de perspicacité, et il serait utile que quelqu'un puisse partager son expérience ou me guider sur la bonne voie.

41
Rahul Gautam

Vous pouvez penser aux greenlets plus comme des fils coopératifs. Cela signifie qu'il n'y a pas de planificateur de commutation préventive entre vos threads à un moment donné - au lieu de cela, vos greenlets renoncent volontairement/explicitement à un contrôle les uns aux autres à des points spécifiés dans votre code.

Le GIL les affecte-t-il? Peut-il y avoir plus d'un greenlet à la fois?

Un seul chemin de code est en cours d'exécution à la fois - l'avantage est que vous avez le contrôle ultime sur celui qui est.

Quels sont les pièges de l'utilisation des greenlets ou des tasklets?

Vous devez être plus prudent - un greenlet mal écrit ne donnera pas le contrôle aux autres greenlets. D'un autre côté, puisque vous savez quand un greenlet changera de contexte, vous pourrez peut-être vous en sortir et non créer des verrous pour les structures de données partagées.

Si j'utilise des greenlets, combien d'entre eux un processus peut-il gérer? (Je me demande parce que dans un seul processus, vous pouvez ouvrir des threads jusqu'à la limite umask définie dans votre système * ix.)

Avec des threads réguliers, plus vous avez, plus vous avez de surcharge de planificateur. De plus, les threads réguliers ont toujours une surcharge de changement de contexte relativement élevée. Les greenlets ne sont pas associés à ces frais généraux. De la documentation de la bouteille :

La plupart des serveurs limitent la taille de leurs pools de travail à un nombre relativement faible de threads simultanés, en raison de la surcharge élevée impliquée dans le basculement entre et la création de nouveaux threads. Bien que les threads soient bon marché par rapport aux processus (fourches), ils sont toujours coûteux à créer pour chaque nouvelle connexion.

Le module gevent ajoute des greenlets au mix. Les greenlets se comportent de manière similaire aux fils traditionnels, mais sont très bon marché à créer. Un serveur basé sur gevent peut engendrer des milliers de greenlets (un pour chaque connexion) avec presque pas de surcharge. Le blocage de greenlets individuels n'a aucun impact sur la capacité des serveurs à accepter de nouvelles demandes. Le nombre de connexions simultanées est pratiquement illimité.

Il y a aussi quelques lectures supplémentaires ici si vous êtes intéressé: http://sdiehl.github.io/gevent-tutorial/

20
Martin Konecny

Je suppose que vous parlez de greenlets evenlet/gevent

1) Il ne peut y avoir qu'un seul greenlet en cours d'exécution

2) C'est du multithreading coopératif, ce qui signifie que si un greenlet est bloqué dans une boucle infinie, tout votre programme est bloqué, généralement les greenlets sont planifiés de manière explicite ou pendant les E/S

3) Beaucoup plus que les threads, cela dépend de la quantité de RAM disponible

4
rguillebert