2016-07-22 38 views
1

In einem Python-Modul A mache ich ein paar Sachen. Während ich das Zeug mache, erstelle ich eine Thrift-Verbindung. Das Problem ist, dass nach dem Start der Verbindung das Programm in der Netzwerklogik stecken bleibt. (d. h. Blockierung).Nicht-blockierender Server Apache Thrift Python

In Modul A Ich habe:

stuff = "do some stuff" 
network.ConnectionManager(host, port, ...) 
stuff = "do more stuff" # not getting to this point 

im Netz ...

ConnectionManager.start_service_handler() 
def start_service_handler(self): 
     handler = ServiceHandler(self) 
     processor = Service.Processor(handler) 
     transport = TSocket.TServerSocket(port=self.port) 
     tfactory = TTransport.TBufferedTransportFactory() 
     pfactory = TBinaryProtocol.TBinaryProtocolFactory() 
     # server = TServer.TThreadedServer(processor, transport, tfactory, pfactory) 
     server = TNonblockingServer(processor, transport, tfactory, pfactory) 
     logger().info('starting server...') 
     server.serve() 

Ich versuche, dies aber noch der Code in das Modul A wird nicht fortgesetzt, sobald der Verbindungscode beginnt.

Ich dachte TNonblockingServer würde den Trick tun, aber leider nicht.

Antwort

2

Die Codeblöcke bei server.serve(), die von Entwurf, über alle Zielsprachen, die von Thrift unterstützt werden. Der üblicher Anwendungsfall ist einen Server wie dieser (Pseudocode) auszuführen:

init server 
setup thrift protocol/tramsport stack 
server.serve() 
shutdown code 

Der „nonblocking“ bezieht sich nicht auf den server.serve() Aufruf, sondern an den Code den eigentlichen Client-Anruf. Mit einer TSimpleServer kann der Server nur einen Anruf zu einem Zeitpunkt behandeln. Im Gegensatz dazu ist die TNonblockingServerdesigned to accept a number of connections in parallel.

Fazit: Wenn Sie einen Thrift-Server betreiben und parallel dazu andere Aufgaben erledigen möchten oder den Server während des Programmlaufs starten und stoppen müssen, benötigen Sie einen anderen Thread, um dies zu erreichen.