2009-10-19 6 views
7

Je cherche un moyen d'empêcher plusieurs hôtes d'émettre des commandes simultanées à un écouteur Python XMLRPC. L'écouteur est responsable de l'exécution de scripts pour effectuer des tâches sur ce système qui échoueraient si plusieurs utilisateurs tentaient d'exécuter ces commandes en même temps. Est-il possible de bloquer toutes les demandes entrantes jusqu'à ce que l'instance unique soit terminée?Python XMLRPC avec demandes simultanées

+1

sont les clients au courant de la matrice de conflit? devraient-ils être assez intelligents pour se programmer selon cette matrice? comment est-ce que les activités sont synchronisées etc ... – jldupont

+0

utilisez-vous SimpleXMLRPCServer comme je pensais que c'était un seul thread ... – SeriousCallersOnly

+0

J'utilise le SimpleXMLRPCServer, mais il semble que je peux lancer la même commande à partir de différents hôtes simultanément, ce qui est ce que je besoin d'empêcher – MattB

Répondre

15

Je pense que le module python SimpleXMLRPCServer est ce que vous voulez. Je crois que le comportement par défaut de ce modèle bloque les nouvelles demandes lorsque la demande actuelle est en cours de traitement. Le comportement par défaut m'a donné beaucoup de problèmes et j'ai changé ce comportement en mixant dans la classe ThreadingMixIn afin que mon serveur xmlrpc puisse répondre à plusieurs requêtes en même temps. Si je comprends bien votre question, SimpleXMLRPCServer est la solution. Utilisez-le directement.

+0

+1, c'est parfait! –

0

Pouvez-vous avoir un autre canal de communication? Si oui, avoir un protocole "rappelez-moi quand c'est mon tour" qui court entre le serveur et les clients. En d'autres termes, chaque client enregistrerait son intention d'émettre des demandes au serveur et ledit serveur "rappellerait" le client suivant quand il est prêt.

+0

Je ne suis pas nécessairement aussi préoccupé par le rappel des clients, plus dans la prévention des commandes en conflit étant émis par plusieurs hôtes – MattB

+0

pouvez-vous renvoyer un code HTTP 5xx (serveur occupé ou autre)? – jldupont

+0

Qu'est-ce qui définit les "commandes conflictuelles"? – jldupont

0

Il y a plusieurs choix:

  1. Utiliser un serveur unique processus unique thread comme SimpleXMLRPCServer pour traiter les demandes par la suite.
  2. Utilisez threading.Lock() dans un serveur à thread.
  3. Vous avez un mécanisme de verrouillage externe (comme lockfile module ou GET_LOCK() fonction dans mysql) dans le serveur multiprocessus.
Questions connexes