Vert-filetage et de fil en Python
Comme Wikipédia membres:
Fils verts émuler les environnements multi-threads sans compter sur n'importe quel système d'exploitation natif de capacités, et ils sont gérés dans l'espace utilisateur au lieu de l'espace noyau, leur permettant de travailler dans des environnements qui n'ont pas de support natif des threads.
Python fils sont mis en œuvre comme pthreads (kernel threads)
,
et à cause de la global interprète de verrouillage (GIL), un Python processus s'exécute uniquement un seul thread à la fois.
[QUESTION]
Mais dans le cas de Green-threads
(ou soi-disant greenlet ou tasklets),
- Ne le
GIL
affectent-ils? Peut-il y avoir plus d'un greenlet
cours d'exécution à un moment?- Quels sont les pièges de l'utilisation greenlets ou tasklets?
- Si j'utilise greenlets, combien d'entre eux peut un processus peut-il gérer? (Je me demande parce que dans un seul processus, vous pouvez ouvrir des threads jusqu'à
ulimit(-s, -v) défini dans votre *ix système).
J'ai besoin d'un peu de perspicacité, et il serait utile si quelqu'un pouvait partager leur expérience, ou me guider vers le droit chemin.
- La réponse à tous les trois est "ça dépend de la greenlet mise en œuvre".
- Stackless Python pénètre dans beaucoup de ces concepts. Je recommande d'obtenir une version et de faire le tutoriel sur le site officiel. Il a beaucoup de explination sur les types de questions que vous vous posez.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez penser greenlets plus comme coopérative de threads. Ce que cela signifie, c'est qu'il n'y a pas de planificateur de manière préventive commutation entre votre fils à un moment donné - à la place de votre greenlets volontairement/expressément renoncer à de contrôle de l'un à l'autre à des points spécifiques de votre code.
Un seul chemin d'accès du code est en cours d'exécution à un moment - l'avantage est que vous avez le contrôle ultime au cours de laquelle celui qui est.
Vous devez être plus prudent - un mal écrit greenlet ne va pas céder le contrôle à d'autres greenlets. D'autre part, puisque vous savez que lorsqu'un greenlet volonté de changement de contexte, vous pourriez être en mesure de s'en tirer avec pas créer des serrures pour le partage des données-structures.
Avec régulièrement des threads, plus vous avez le plus de planificateur de frais généraux que vous avez. Aussi régulièrement des threads restent relativement élevée du contexte de l'interrupteur de surcharge. Greenlets n'ont pas cette surcharge de travail qui leur sont associés. À partir de la bouteille de documentation:
Il y a aussi quelques autres à lire ici si vous êtes intéressés:
http://sdiehl.github.io/gevent-tutorial/
Je suppose que vous parlez de evenlet/gevent greenlets
1) Il peut être un seul greenlet de course
2) C'est la coopérative de multithreading, ce qui signifie que si un greenlet est bloqué dans une boucle infinie, l'ensemble de votre programme est bloqué, généralement greenlets sont prévues, soit explicitement, soit au cours de l'I/O
3) beaucoup plus que les fils, il dépend de la quantité de RAM disponible