2009-10-19 15 views
7

Sto cercando un modo per impedire a più host di inviare comandi simultanei a un listener XMLRPC Python. L'ascoltatore è responsabile dell'esecuzione di script per eseguire attività su quel sistema che fallirebbero se più utenti tentassero di emettere questi comandi contemporaneamente. C'è un modo per bloccare tutte le richieste in arrivo fino al completamento della singola istanza?Python XMLRPC con richieste simultanee

+1

i client sono a conoscenza della matrice dei conflitti? dovrebbero essere abbastanza intelligenti da programmarsi secondo questa matrice? come si sincronizzano le attività ecc ... – jldupont

+0

stai usando SimpleXMLRPCServer perché pensavo che fosse single threaded ... – SeriousCallersOnly

+0

Sto usando SimpleXMLRPCServer, ma sembra che possa lanciare lo stesso comando da host diversi contemporaneamente, che è quello che io È necessario prevenire – MattB

risposta

15

Penso che il modulo Python SimpleXMLRPCServer sia quello che vuoi. Credo che il comportamento predefinito di quel modello stia bloccando nuove richieste quando la richiesta corrente è in fase di elaborazione. Il comportamento predefinito mi ha dato un sacco di problemi e ho modificato questo comportamento mescolando la classe ThreadingMixIn in modo che il mio server xmlrpc potesse rispondere a più richieste nello stesso tempo.

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

Se ho compreso correttamente la tua domanda, SimpleXMLRPCServer è la soluzione. Basta usarlo direttamente.

+0

+1, è perfetto! –

0

Si può avere un altro canale di comunicazione? In caso affermativo, avere un protocollo "richiamami quando è il mio turno" tra il server e i client.

In altre parole, ogni client registrava l'intenzione di inviare richieste al server e il server avrebbe "richiamato" il client successivo quando è pronto.

+0

Non sono necessariamente interessato a richiamare i client, più nella prevenzione di comandi in conflitto emessi da più host – MattB

+0

è possibile inviare un codice HTTP 5xx (server occupato o altro)? – jldupont

+0

Che cosa definisce "comandi in conflitto"? – jldupont

0

ci sono diverse scelte: Server

  1. uso singola-processo-single-thread come SimpleXMLRPCServer per elaborare le richieste in seguito.
  2. Utilizzare threading.Lock() nel server thread.
  3. Si dispone di un meccanismo di blocco esterno (come il modulo lockfile o la funzione GET_LOCK() in mysql) nel server multiprocesso.
Problemi correlati