Un propre, alternative légère à Python tordu?

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.

De sorte que 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 la mesure:

  • Twisted: L'ancêtre de Python réacteur cadres: semble complexe et un peu gonflé cependant. 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: Si 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 plate-forme]

Est là tout ce 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 à 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 coup de pouce.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 de les outils disponibles pour ce travail]

  • Python est multithread, il n'a tout simplement pas permettre à deux threads pour exécuter du code Python en même temps.
  • en effet, il est, donc, en théorie, puisque socket est un module C, si ils laissent le GIL aller de l'avant d'appeler le sous-jacent de routine, les choses pourraient en fait être simultanées. Même encore, je crois que j'ai envie de revenir à quelque chose de single-threaded.
  • J'ai appris beaucoup plus de votre question que de réponses.
  • hé, merci, je suppose! Il y a eu quelques bons pointeurs dans les réponses aussi, spécifiquement intgr de. Je connaissais beaucoup d'options là-bas et je ne voulais pas les réponses emballés avec ceux-ci donc, j'ai pensé aller à la peine de mentionner ce que je savais 🙂
  • > maintenant les gens semblent favoriser une co-routine en fonction de la solution plutôt qu'une traditionnelle réacteur / rappel orienté Ce n'est pas une bonne comparaison. "co-routine basée sur des solutions" et "réacteur" orientées vers les solutions sont orthogonaux. (En ignorant le fait que Python n'a pas de coroutines) jetez un oeil à Tordu de inlineCallbacks pour voir comment vous pouvez avoir le style de programmation vous semblent préférer grâce à une solide maturité de la couche réseau qui ne va pas vous exposer à des complexes plate-forme de particularités.
  • Calderone: OK, je vais regarder inlineCallbacks, qui sont nouveaux pour moi. Comme je l'ai dit avant, il y a une courbe d'apprentissage abrupte avec tordus, où dois-je commencer pour le genre de petite tâche que je veux réaliser? De toute façon, je suppose que pourquoi certaines personnes voient les co-routines comme une bonne alternative est résumée ici: en apesanteur.io/arrière-plan mais vous avez raison: je suis sûr que l'un quelconque des co-routine implémentations de Python peut être utilisé avec des Tordus dans la théorie. Et oui, Python n'est pas co-routines hors de la boîte, mais vous pouvez ajouter assez facilement.
  • Calderone: Vous pouvez mettre en œuvre des coroutines dans la plaine de Python en utilisant le générateur de fonctions (oui c'est un hack, mais ils sont toujours coroutines).
  • Je ne comprends pas Tordu. Il semble vouloir mettre en œuvre chaque protocole dans le monde, oh oui, et veut travailler avec n'importe quel événement de la boucle dans le monde sans que l'utilisateur configuration (GTK, etc). Cela aurait été bien si il y avait quelque chose asynchrone qui permet simplement vous pile de protocoles toutefois vous le souhaitez.
  • Twisted est quelque chose asynchrone qui permet simplement vous pile de protocoles toutefois vous voulez :). J'ai donné une conférence sur, entre autres choses, comment léger, il est. Voir ici pycon.tv/#/video/58
  • Une chance pour une mise à jour de cette question et/ou des réponses à refléter l'état actuel de l'art?
  • Quelques points à ajouter: 1. Tornade fonctionne très bien sur Windows. C'est juste pas aussi performant et évolutif, car il utilise select pour les I/O de multiplexage. Mais vous devriez être en mesure d'obtenir un rendement décent avec tornade-pyuv. 2. Il est maintenant asyncio en Python 3.3,+ et de ses backport trollius qui permet d'exécuter n'importe quel Tornade application dans sa boucle d'événement (Twisted sera bientôt pris en charge).

InformationsquelleAutor jkp | 2009-12-01