224 votes

Une alternative propre et léger à Python ' s tordus ?

Un (long) tout à l'heure, j'ai écrit une web-araignée que je multithread pour permettre à des demandes concurrentes pour se produire en même temps. Qui était dans mon Python de la jeunesse, dans les jours avant que je savais à propos de la GIL et les malheurs qu'il crée pour le code multithread (c'est à dire, la plupart du temps des trucs se termine juste en haut sérialisé!)...

J'aimerais retravailler ce code pour le rendre plus robuste et plus performant. Il existe essentiellement deux façons que je pouvais le faire: j'ai pu utiliser le nouveau module multiprocessing en 2.6+ ou je pourrais aller pour un réacteur / événement basée sur le modèle d'une certaine sorte. Je préfère faire le plus tard, car il est beaucoup plus simple et moins sujettes à l'erreur.

Donc, la question se rapporte à ce qui cadre le mieux adapté à mes besoins. Ce qui suit est une liste des options que je sais à propos de ce jour:

  • Twisted: L'ancêtre de Python réacteur cadres: semble complexe et un peu gonflé. Courbe d'apprentissage abrupte pour un petit groupe.
  • Eventlet: les gars à lindenlab. Greenlet basé cadre qui est orienté vers ces types de tâches. J'ai eu un coup d'oeil au code et si c'est pas trop jolie: non-pep8 conforme, dispersés avec des impressions (pourquoi des gens font cela dans un cadre!?), API semble un peu incohérent.
  • PyEv: Immature, ne semble pas être n'importe qui à l'utiliser maintenant, bien qu'il soit basé sur libevent il y a donc un solide arrière-plan.
  • asyncore: à Partir de la stdlib: über faible niveau de, ressemble à beaucoup de travail sur le terrain impliqués juste pour obtenir quelque chose sur le sol.
  • tornade: Bien que c'est un serveur orienté produit conçu pour le serveur de sites web dynamiques, il ne disposent d'un async client HTTP et un simple ioloop. Regarde comme elle pourrait faire le travail, mais pas de quoi il était destiné. [edit: ne fonctionne pas sur Windows, malheureusement, qui compte pour moi - c'est une exigence pour moi, à l'appui de cette lame de plateforme]

Est-il quelque chose que j'ai manqué à tous? Il doit sûrement y avoir une bibliothèque qui s'adapte le sweet-spot d'une simplification de la async mise en réseau de la bibliothèque!

[edit: un grand merci à intgr pour son pointeur vers cette page. Si vous faites défiler vers le bas, vous verrez il y a vraiment une belle liste de projets qui visent à s'attaquer à cette tâche d'une manière ou d'une autre. Il semble effectivement que les choses ont bien évolué depuis la création de Twisted: maintenant les gens semblent favoriser une co-routine en fonction de la solution plutôt qu'une traditionnelle réacteur / rappel orientée. Les avantages de cette approche sont plus claire, plus directe, code: j'ai certainement trouvé dans le passé, surtout lorsque l'on travaille avec boost.asio en C++, qui de rappel en fonction du code peut conduire à des conceptions qui peut être difficile à suivre et sont relativement obscure pour un oeil non averti. À l'aide de co-routines permet d'écrire du code qui ressemble un peu plus synchrone au moins. Je suppose que maintenant, ma tâche est de travailler sur l'une de ces nombreuses bibliothèques, j'aime bien le look et lui donner un aller! Heureux j'ai demandé aujourd'hui...]

[edit: peut-être d'intérêt pour tous ceux qui ont suivi ou trébuché sur cette question ou un soucis sur ce sujet dans tous les sens: j'ai trouvé une très bonne description de l'état actuel des outils disponibles pour ce travail]

100voto

clemesha Points 1460

Twisted est complexe, vous avez raison à ce sujet. Twisted est pas pléthorique.

Si vous prenez un coup d'oeil ici: http://twistedmatrix.com/trac/browser/trunk/twisted vous trouverez un ensemble organisé, complet, et très bien testé suite de nombreux protocoles de l'internet, ainsi comme l'aide de code à écrire et à déployer très sophistiqué applications réseau. Je ne confondez pas les gonfler avec de l'exhaustivité.

Il est bien connu que ce qui est Tordu la documentation n'est pas le plus convivial du premier coup d'œil, et je crois qu'il se détourne d'un regrettable nombre de personnes. Mais Tordu est incroyable (à mon humble avis), si vous mettez dans le temps. Je l'ai fait et il s'est avéré être la peine, et je le recommande à d'autres d'essayer la même chose.

57voto

Denis Bilenko Points 2975

gevent est eventlet nettoyé.

API-sage, il suit les mêmes conventions que la bibliothèque standard (en particulier, le filetage et le multitraitement modules) où il fait sens. Si vous avez des choses familières comme la File d'attente et l'Événement de travailler avec.

Il ne supporte libevent (mise à jour: libev depuis 1.0) comme réacteur de mise en œuvre, mais l'exploite à fond, avec un rapide WSGI serveur basé sur libevent-http et la résolution des requêtes DNS par le biais de libevent-dns plutôt que d'utiliser un pool de threads comme la plupart des autres bibliothèques. (mise à jour: depuis la 1.0 c-ares sert à faire asynchrone des requêtes DNS; pool de threads est également une option.)

Comme eventlet, il fait les rappels et Deferreds inutiles en utilisant greenlets.

Découvrez les exemples: téléchargement simultané de plusieurs url, le temps d'interrogation webchat.

29voto

intgr Points 9041

J'ai aimé l' assentiment module Python qui s'appuie sur Stackless Python microthreads ou Greenlets pour la lumière-poids de filetage. Tout blocage du réseau I/O est de façon transparente en asynchrone via un seul libevent boucle, de sorte qu'il devrait être presque aussi performant qu'un vrai serveur asynchrones.

Je suppose que c'est similaire à Eventlet de cette façon.

L'inconvénient est que son API est assez différente de Python sockets/threading modules; vous avez besoin de réécrire un peu juste de votre demande (ou d'écrire une compatibilité cale d'épaisseur de couche)

Edit: Il semble qu'il y a aussi de cogénération, qui est similaire, mais utilise Python 2.5 est renforcée générateurs pour son coroutines, au lieu de Greenlets. Cela rend plus facile à transporter que l'accord et d'autres solutions de rechange. Réseau d'e/S est fait directement avec epoll/kqueue/iocp.

28voto

jkp Points 20410

Une très intéressante comparaison de ces cadres a été compilé par Nicholas Piël sur son blog : c’est bien intéressant à lire !

16voto

Adam Hupp Points 789

Aucune de ces solutions ne seront pas ce fait que le GIL empêche le parallélisme de l’UC - ils sont juste meilleures façons d’obtenir le parallélisme d’e/s que vous avez déjà avec les threads. Si vous pensez que vous pouvez faire mieux IO, par tous on entend poursuivre l’un d’eux, mais si votre goulot d’étranglement se trouve dans le traitement des résultats rien ici aideront à l’exception du module de multitraitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X