2012-06-21 2 views
1

J'ai un service fourni par une API REST, avec une bibliothèque Python l'enveloppant à l'aide de requêtes python.Services Twisted d'interconnexion serveur-client XML-RPC et REST

J'ai une interface utilisateur «bête» conçue par un tiers (pas Python) pour se connecter à un XML-RPC local.

Maintenant, je dois connecter les deux extrémités et transmettre les appels XML-RPC à l'API REST et renvoyer les résultats. Il est principalement asynchrone et ne dépend pas des résultats renvoyés à l'utilisateur en temps réel. La plupart des appels XML-RPC sont censés retourner immédiatement, mettre en file d'attente une tâche, et un autre appel interrogera les résultats plus tard. Les données sont stockées dans une base de données sqlite jusqu'à ce que nécessaire. Donc, j'ai décidé d'utiliser twisted.web.xmlrpc pour cette couche intermédiaire et d'utiliser la librairie basée sur les requêtes pour les appels distants et cela fonctionne très bien. Je crois que je bloque de temps à autre le loop principal de Twisted, mais ce n'est pas grave.

Le problème est que je dois aussi faire de gros téléchargements de fichiers de cette couche intermédiaire vers le serveur HTTP fournissant l'API REST. Je ne peux pas faire ces uploads en utilisant la librairie basée sur les requêtes car elle bloquera la boucle tordue jusqu'à ce que le téléchargement soit terminé. Je préfère ne pas utiliser le multithreading, et je ne veux vraiment pas réécrire la librairie basée sur les requêtes python que j'ai en tant que client tordu. Y a-t-il un moyen d'intégrer des requêtes dans le mainloop de twisted, ou toute autre solution raisonnable?

+2

"Comment réparer mon code sans le changer?" C'est un dur. La plupart des correctifs impliquent au moins quelques modifications. –

+0

Personne n'aime un smartass ... –

+0

Désolé de vous avoir dérangé. Je vais essayer d'éviter vos questions à l'avenir. –

Répondre

1

Si vous appréciez le style d'API des demandes, mais que vous voulez quelque chose qui fonctionne avec Twisted, pensez à utiliser treq. Il existe support libraries pour les interfaces d'écriture qui peuvent être synchrones ou asynchrones en fonction des besoins de leur appelant.

Si vous voulez vraiment utiliser des requêtes, mais que vous ne voulez pas bloquer la boucle principale, vous pouvez l'appeler avec twisted.internet.threads.deferToThread. C'est la plupart du temps transparent, et si vos demandes ne partagent aucun état, vous pouvez presque ignorer le fait que vous utilisez le multithreading.

Mais, finalement, le commentaire de Jean-Paul est correct; vous allez devoir apporter quelques modifications à la façon dont ce code fonctionne, si vous voulez changer la façon dont cela fonctionne.

+0

C'était il y a quelques mois, et à la fin j'ai utilisé deferToThread comme vous le suggérez. –