Greenlet Vs. Fils
Je suis nouveau sur gevents et greenlets. J'ai trouvé quelques une bonne documentation sur la façon de travailler avec eux, mais aucun ne m'a donné de justification sur comment et quand faut-il utiliser greenlets!
- Ce qu'ils sont vraiment bon?
- Est-ce une bonne idée de les utiliser dans un serveur proxy ou pas?
- Pourquoi ne pas les threads?
Ce que je ne suis pas sûr de savoir comment ils peuvent nous fournir la simultanéité si ils sont fondamentalement co-routines.
- C'est à propos de greenthreads en Java. Ma question est sur le greenlet en Python. Ai-je raté quelque chose ?
- Autant que je sache, les threads en python sont en fait pas vraiment concurrentes en raison de la global interprète de verrouillage. Donc, il serait résument à la comparaison entre les frais généraux de ces deux solutions. Même si je comprends qu'il y a plusieurs implémentations de python, de sorte que cela peut ne pas s'appliquer pour tous.
- Disponible (et PyPy dès à présent) ne va pas interpréter Python (byte)du code en parallèle (c'est vraiment physiquement dans le même temps sur les deux distinctes de cœurs de PROCESSEUR). Cependant, tout un programme en Python n'est en vertu de la GIL (exemples courants sont les syscalls, y compris les e/S et fonctions C qui, délibérément la libération de la GIL), et un
threading.Thread
est en fait un OS thread avec toutes les ramifications. Donc, c'est vraiment pas tout à fait aussi simple que cela. Par la voie, Jython n'a pas de GIL autant que je sache, et PyPy essaie de se débarrasser de lui aussi.
Vous devez vous connecter pour publier un commentaire.
Greenlets fournir la simultanéité, mais pas parallélisme. La simultanéité est lorsque le code peut s'exécuter indépendamment l'un de l'autre code. Le parallélisme est l'exécution de code simultané simultanément. Le parallélisme est particulièrement utile lorsqu'il y a beaucoup de travail à faire dans l'espace utilisateur, et qui est généralement CPU-lourd. La simultanéité est utile pour séparer des problèmes, permettant aux différentes parties pour être planifiée et gérée plus facilement en parallèle.
Greenlets vraiment briller dans la programmation de réseau où les interactions avec un socket peut se produire indépendamment des interactions avec d'autres supports. C'est un exemple classique de la simultanéité. Parce que chaque greenlet s'exécute dans son propre contexte, vous pouvez continuer à utiliser les Api synchrone sans filetage. C'est bien parce que les fils sont très coûteux en termes de mémoire virtuelle du noyau et des frais généraux, de sorte que la simultanéité vous pouvez atteindre avec des threads de l'est nettement moins. En outre, le filetage en Python est plus cher et plus limité que d'habitude en raison de la GIL. Des Alternatives à la simultanéité sont généralement des projets comme Tordu, libevent, libuv, node.js etc, où tous vos partages de codes le même contexte d'exécution, et d'enregistrer les gestionnaires d'événements.
C'est une excellente idée pour utiliser greenlets (avec les réseaux de soutien comme par gevent) pour la rédaction d'un proxy, comme votre traitement des demandes sont en mesure d'exécuter de manière indépendante et doit être écrit en tant que tel.
Greenlets fournir de simultanéité pour les raisons que j'ai donné plus tôt. La simultanéité n'est pas de parallélisme. En dissimulant l'enregistrement d'un événement et l'exécution de la planification pour vous sur les appels qui seraient normalement bloquer le thread en cours, des projets comme gevent exposer cette simultanéité sans avoir à modifier une API asynchrone, et à un coût nettement moins important pour votre système.
Prenant @Max de réponse et en ajoutant une certaine pertinence pour la mise à l'échelle, vous pouvez voir la différence. J'ai réalisé cela en modifiant l'Url à être rempli comme suit:
J'ai dû abandonner le multi process version car il est tombé avant que j'ai eu 500; mais à 10 000 itérations:
De sorte que vous pouvez le voir il ya une certaine différence significative dans les I/O à l'aide de gevent
C'est assez intéressant à analyser.
Voici un code pour comparer les performances des greenlets contre le multitraitement piscine versus multi-threading:
voici les résultats:
Je pense que greenlet prétend qu'il n'est pas lié par GIL contrairement à la multithreading bibliothèque. En outre, Greenlet doc a dit qu'il est destiné aux opérations de réseau. Pour un réseau intensif de l'opération, le fil de commutation est très bien et vous pouvez voir que l'approche de multithreading est assez rapide.
Aussi il est toujours prefeerable utiliser python officiel de bibliothèques; j'ai essayé d'installer greenlet sur windows et rencontré une dépendance dll problème et j'ai effectué ce test sur une machine virtuelle linux.
Toujours essayer d'écrire un code avec l'espoir qu'il fonctionne sur n'importe quelle machine.
getsockbyname
met en cache les résultats au niveau de l'OS (du moins sur ma machine, il n'). Lorsqu'il est appelé sur une inconnue ou expiré DNS il va effectuer une requête réseau, qui pourrait prendre un certain temps. Lorsqu'elle est appelée sur un nom d'hôte qui a tout récemment été résolu il sera de retour la réponse beaucoup plus rapide. Par conséquent, votre méthode de mesure est erronée ici. C'est ce qui explique votre étrange résultats gevent ne peut pas vraiment être bien pire que le multithreading - les deux ne sont pas-vraiment-parallèle, au niveau de la VM.using_gevent() 421.442985535ms using_multiprocessing() 394.540071487ms using_multithreading() 402.48298645ms
Correction pour @TemporalBeing 's réponse ci-dessus, greenlets ne sont pas "plus vite" que les threads et c'est une mauvaise technique de programmation pour frayer 60000 fils de résoudre un des problèmes de simultanéité, un petit pool de threads est plutôt approprié. Ici, c'est un plus raisonnable de comparaison (à partir de mon reddit post en réponse aux personnes en citant cette SORTE de post).
Voici quelques résultats:
le malentendu tout le monde a au sujet de la non-bloquant IO avec Python est la croyance que l'interpréteur Python peuvent assister aux travaux de l'extraction des résultats à partir de sockets à grande échelle, plus rapide que les connexions réseau eux-mêmes, de retour IO. Tout cela est certainement vrai dans certains cas, il n'est pas vrai presque aussi souvent que les gens pensent, parce que l'interpréteur Python est vraiment, vraiment lent. Dans mon billet de blog ici, je illustrent quelques graphiques qui montrent que, même pour des choses très simples, si vous traitez avec des chips et rapide d'accès au réseau pour des choses comme des bases de données ou des serveurs DNS, ces services peuvent revenir beaucoup plus rapide que le code Python peut assister à plusieurs milliers de ces connexions.