PY-18029 Use TSingleThreadedServer instead of TThreadedServer

This commit is contained in:
Alexander Koshevoy
2018-08-22 23:16:40 +03:00
parent ea01237229
commit 3447bf33b7
2 changed files with 46 additions and 18 deletions
+5 -18
View File
@@ -1,9 +1,9 @@
import socket
import threading
from _pydev_comm.server import TSingleThreadedServer
from _pydev_comm.transport import TSyncClient, open_transports_as_client, _create_client_server_transports
from _shaded_thriftpy.protocol import TBinaryProtocolFactory
from _shaded_thriftpy.server import TThreadedServer
from _shaded_thriftpy.thrift import TProcessor
@@ -21,15 +21,8 @@ def start_rpc_server(server_transport, server_service, server_handler, proto_fac
strict_write=False)):
# setup server
processor = TProcessor(server_service, server_handler)
# todo as `server.serve()` is excessive we may want to get rid of `server` as `TThreadedServer`
server = TThreadedServer(processor, server_transport, iprot_factory=proto_factory)
client = server.trans.accept()
t = threading.Thread(target=server.handle, args=(client,))
t.setDaemon(True)
t.start()
server = TSingleThreadedServer(processor, server_transport, daemon=True, iprot_factory=proto_factory)
server.serve()
return server
@@ -61,11 +54,5 @@ def _rpc_server(server_socket, server_service, client_service, server_handler_fa
# setup server
processor = TProcessor(server_service, server_handler)
# todo as `server.serve()` is excessive we may want to get rid of `server` as `TThreadedServer`
server = TThreadedServer(processor, server_transport, iprot_factory=proto_factory)
client = server.trans.accept()
t = threading.Thread(target=server.handle, args=(client,))
t.setDaemon(True)
t.start()
server = TSingleThreadedServer(processor, server_transport, daemon=True, iprot_factory=proto_factory)
server.serve()
@@ -0,0 +1,41 @@
import threading
import traceback
from _shaded_thriftpy.server import TServer
from _shaded_thriftpy.transport import TTransportException
class TSingleThreadedServer(TServer):
"""Server that accepts a single connection and spawns a thread to handle it."""
def __init__(self, *args, **kwargs):
self.daemon = kwargs.pop("daemon", False)
TServer.__init__(self, *args, **kwargs)
def serve(self):
self.trans.listen()
try:
client = self.trans.accept()
t = threading.Thread(target=self.handle, args=(client,))
t.setDaemon(self.daemon)
t.start()
except KeyboardInterrupt:
raise
except Exception as x:
traceback.print_exc()
def handle(self, client):
itrans = self.itrans_factory.get_transport(client)
otrans = self.otrans_factory.get_transport(client)
iprot = self.iprot_factory.get_protocol(itrans)
oprot = self.oprot_factory.get_protocol(otrans)
try:
while True:
self.processor.process(iprot, oprot)
except TTransportException:
pass
except Exception as x:
traceback.print_exc()
itrans.close()
otrans.close()