Sto utilizzando il Broker prospettiva di twisted per parlare tra il client e il server. Il client richiede dal server un metodo remoto 'remote_ssh'. Ciò fa sì che il server PB avvii una connessione SSH utilizzando la libreria SSH di Paramiko e recupera una configurazione da un dispositivo remoto.ritardo lato server broker twistato prospettiva
Funziona tutto bene, ma quando eseguo questa operazione per più dispositivi remoti, vedo il seguente comportamento: il client di Prospettiva Broker invierà tutte le richieste al server PB. Il server PB eseguirà quindi queste richieste una alla volta (che va bene), ma non restituirà QUALSIASI dei risultati fino a quando TUTTI non saranno completi.
Ecco il codice lato server PB rilevanti:
class RMethods(pb.Root):
def remote_ssh(self, aDict):
self.login('SSH', aDict) # Login to remote device
response = self.aSSH.retrieve() # Retrieve the config
self.aSSH.close()
return response
if __name__ == "__main__":
reactor.listenTCP(1885, pb.PBServerFactory(RMethods()))
reactor.run()
Guardando varie informazioni a livello di sistema (TCPDump e netstat), vedo il seguente (assumere 5 chiamate del metodo remoto):
chiamata remote_ssh da PB client al server PB per i cinque dispositivi remoti avviene a circa lo stesso tempo
self.login device 1
self.aSSH.retrieve() device 1
self.aSSH.close() device 1
self.login device 2
self.aSSH.retrieve() device 2
self.aSSH.close() device 2
...
self.login device 5
self.aSSH.retrieve() device 5
self.aSSH.close() device 5
return results for all 5 devices
non sto capendo il motivo per cui attende di restituire il r esulta (ad es. perché aspetta fino al completamento di device5 prima che vengano restituiti i risultati per device1).
Stavo per commentare potresti includere un esempio su come usare Conch quando mi sono ricordato che hai già scritto: http://as.ynchrono.us/2011/03/twisted-conch-in-60-seconds.html – stderr
Anche con i thread, non vedo come posso farlo (ci ho provato). Il problema fondamentale in cui mi imbatto è che devo bloccare per aspettare che i risultati SSH ritornino, ma una volta che blocco il principale Prospettive Broker remote_method, allora blocca tutta l'esecuzione delle altre connessioni SSH usando remote_method. –
Perché devi bloccare per attendere il ritorno dei risultati SSH? O evitare il blocco eseguendo il lavoro in un thread o processo separato o evitare il blocco utilizzando le API client Conch che non sono bloccanti. –