27 votes

Twisted + SQLAlchemy et la meilleure façon de le faire

Donc, je suis en train d'écrire encore un autre Tordu en fonction de démon. Il aura une xmlrpc interface comme d'habitude donc je peux facilement communiquer avec lui et à d'autres processus d'échange de données avec ce qu'il fallait.

Ce démon a besoin d'accéder à une base de données. Nous avons été à l'aide de SQL Alchimie à la place de codage en dur des chaînes SQL pour nos projets récents - ceux surtout fait pour les applications web dans des Pylônes.

Nous aimerions faire de même pour cette application et de le ré-utiliser le code de bibliothèque qui rend l'utilisation de SQL Alchimie. Alors, que faire? Bien sûr, depuis que la bibliothèque a été écrite pour une utilisation dans un Pylônes app c'est tout simple blocage de code de style que tout le monde est habitué à et tous de la non-bloquante est magiquement manipulés par des Pylônes via le filetage, filetage habitants, dont l'étendue des séances et ainsi de suite.

Alors maintenant, pour Torsadée je suppose que je suis un peu coincé. J'ai pu:

  1. Il suffit d'écrire le sql j'ai besoin directement si c'est minime et l'utilisation de la dbapi piscine tordus à faire runInteractions etc quand j'ai besoin de frapper à la db.
  2. Utiliser les objets et, en soi, le blocage des méthodes dans notre bibliothèque et de bloquer maintenant et puis dans mon Tordu démon. Bah.
  3. Utilisation sAsync dont la dernière mise à jour en 2008 et le type de réutiliser les modèles que nous avons déjà définies, mais pas vraiment, et cela n'a pas d'adresse que le code de la bibliothèque a besoin de travailler dans les Pylônes de trop. Le fait même de travailler avec la dernière version de SQL Alchimie? Qui sait. Ce projet avait l'air super bien, pourquoi est-il apparemment abandonné?
  4. Frayer un distinct sous-processus et ont à traiter avec le code de la bibliothèque et tout, c'est le blocage, les résultats étant retourné à mon démon lorsque tout est prêt, que les objets rassemblés par YAML plus de xmlrpc.
  5. Utilisation deferToThread puis effacer les objets retournés avoir fait en sorte de ne impatients de charges pour que j'ai toutes mes affaires que je pourrais en avoir besoin. Semble genre de uga pour moi.

Je suis également bloqué à l'aide de Python 2.5.4 atm donc pas de 2.6 encore et je ne pense pas que je peux juste faire une importation à partir d'avenir pour obtenir l'accès à la fraîcheur de la nouvelle multitraitement module trucs là. C'est OK, bien, je pense que nous avons affaire avec la communication interprocessus baisse assez bien.

Donc je penche pour l'option 4 pour la plupart, comme qui permettrait d'éviter le péché mortel de la logique de la duplication avec l'option 1, tout en restant le diable loin de threads.

Ma première tentative, mais l'option 2 pour obtenir juste la chose et puis séparer les appels à la bibliothèque de code peut-être dans un processus distinct si il semble que il ya une bonne chance que quelque chose pourrait prendre un peu trop de temps à bloquer sur. Triste. Peut-être une combinaison de Stackless Python et Tordu serait intéressant ici.

Toutes les meilleures idées?

6voto

Glyph Points 17756

Au cours des deux dernières années, Alex Gaynor a créé https://github.com/alex/alchimia qui peut être un meilleur référentiel central pour faire l'intégration avec SQLAlchemy et Twisted.

5voto

Jacob Oscarson Points 4275

Tout d'abord, je ne peux malheureusement seule seconde de votre avis que tordu et SQLAlchemy ne jouent pas très bien. J'ai travaillé quelques avec les deux et serait un peu peur de la complexité qui découlerait de la les mettre ensemble.

Tous la base de données de l'intégration des couches, que je sache, à ce jour utiliser twisteds filetage couche d'intégration, et si vous voulez éviter que les au tous les frais que vous êtes un peu coincé avec le point 4 dans votre liste.

D'autre part, j'ai vu des exemples de base de données de la connexion de code à l'aide de deferToThread() et de ses amis qui a très bien fonctionné.

De toute façon, quelques conseils si vous seriez prêt à envisager d'autres cadres de SQLAlchemy:

Le DivMod les gars ont fait des tentatives de travail sur torsadée intégration de base de données basé sur la Tempête de l'ORM (google pour "la tempête orm").

Voir ce lien pour un exemple:

http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html

Aussi, sur la tête de DivMod du site et avoir un regard sur les sources de leur Axiome db couche (probablement pas de toute utilisation à vous directement depuis c'est Sqlite, mais il est des principes peut être utile).

5voto

kapilt Points 59

Il y a une tempête branche que vous pouvez utiliser avec twisted directement (en interne, il ne le reporter à enfiler des trucs) sur launchpad https://code.launchpad.net/~therve/tempête/torsadée intégration. Je l'ai utilisé bien.

Malheureusement sqlalchemy est beaucoup plus complexe dans la mise en œuvre de l'audit pour async d'utilisation. Si vous voulez vraiment l'utiliser, je vous recommande une approche processus avec un stockage en couche rpc.

sinon, si votre envie d'aventure et de l'utilisation de postgresql, la dernière pyscopg2 soutient vrai async d'utilisation (https://launchpad.net/txpostgres), et la tempête de la source est assez simple à pirater sur ;-)

d'ailleurs la tempête-vous essayé l'année dernière n'ont pas eu la C-extension par défaut (il est maintenant dans les dernières versions.) ce qui pourrait expliquer vos problèmes de vitesse.

3voto

fiorix Points 700

Peut-être que twistar est ce que vous recherchez. Il s'agit d'une implémentation d'enregistrement actif natif (aka ORM) pour twisted, fonctionnant au-dessus de twisted.enterprise.adbapi .

http://findingscience.com/twistar/

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