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]