7
votes

Python XMLRPC avec des demandes simultanées

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


4 commentaires

Les clients sont-ils au courant de la matrice de conflit? Devraient-ils être suffisamment intelligents pour planifier eux-mêmes selon cette matrice? Comment les activités sont-elles synchronisées etc ...


Utilisez-vous SimplexMLRPCServer car je pensais que c'était un seul fileté ...


J'utilise le simppexmlrpcserver, mais il semble que je puisse lancer la même commande à partir de différents hôtes simultanément, ce que j'ai besoin pour empêcher


Ainsi, sur la plus proche inspection, il exécute séquentiellement, planifier des travaux de planification en tant que première serviette. Avec un peu de logique de contrôle, SimplexMLRPCServer devrait faire exactement ce que j'en ai besoin pour, merci tout!


3 Réponses :


0
votes

Pouvez-vous avoir un autre canal de communication? Si oui, alors avez un "appelez-moi quand il s'agit de mon tour" Protocole en cours d'exécution entre le serveur et les clients.

En d'autres termes, chaque client enregistrerait son intention de délivrer des demandes au serveur et ledit serveur «rappelez» le client suivant lorsqu'il est prêt.


3 commentaires

Je ne suis pas nécessairement aussi préoccupé par la remise des clients, Moreso dans la prévention des commandes contradictoires émises par plusieurs hôtes


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


Beaucoup de commandes de SubProcess Shell pour copier des fichiers, supprimer des fichiers, etc.



17
votes

Je pense que Python SimplexMlrpcserver module est ce que vous voulez. Je pense que le comportement par défaut de ce modèle bloque de 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 mélangeant la classe ThreadingMixin de sorte que mon serveur XMLRPC puisse répondre à plusieurs demandes en même temps.

class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass


1 commentaires

J'utilise SimplexMLRPCServer pour un projet et je vais dans l'autre sens - nécessitant une manipulation de la demande simultanée, car lorsqu'une demande est traitée, l'appel du client échoue avec une exception de nettsendRequest. Juste une tête de tête, si vous ne voulez pas avoir besoin d'implémenter des tentatives.



0
votes

Il y a plusieurs choix:

  1. Utilisez un serveur à threads mono-traitant unique tel que SimplexMLRPCServer pour traiter les demandes par la suite.
  2. Utilisez threading.lock () dans le serveur fileté.
  3. vous un mécanisme de verrouillage externe (comme lockfile module ou get_lock () fonction dans mysql) dans le serveur multiprocess.

0 commentaires