Skip to content

Instantly share code, notes, and snippets.

@imlucas
Forked from alecthomas/thrift_gevent.py
Created April 9, 2010 13:15

Revisions

  1. imlucas revised this gist May 25, 2010. 1 changed file with 2 additions and 4 deletions.
    6 changes: 2 additions & 4 deletions thrift_gevent.py
    Original file line number Diff line number Diff line change
    @@ -34,11 +34,9 @@ def _process_socket(self, client):

    # see https://issues.apache.org/jira/secure/attachment/12436303/TMultiplexServer.py
    class TGeventMultiplexServer(TMultiplexServer):
    def __init__(self, *args):
    TMultiplexServer.__init__(self, *args);
    def __init__(self, *args):
    TMultiplexServer.__init__(self, *args);

    class TGEventServer(TServer):
    """Gevent socket server."""
    def serve(self):
    self.serverTransport.listen()
    while True:
  2. imlucas revised this gist May 25, 2010. 1 changed file with 60 additions and 1 deletion.
    61 changes: 60 additions & 1 deletion thrift_gevent.py
    Original file line number Diff line number Diff line change
    @@ -29,4 +29,63 @@ def _process_socket(self, client):
    pass

    itrans.close()
    otrans.close()
    otrans.close()


    # see https://issues.apache.org/jira/secure/attachment/12436303/TMultiplexServer.py
    class TGeventMultiplexServer(TMultiplexServer):
    def __init__(self, *args):
    TMultiplexServer.__init__(self, *args);

    class TGEventServer(TServer):
    """Gevent socket server."""
    def serve(self):
    self.serverTransport.listen()
    while True:
    client = self.serverTransport.accept()
    gevent.spawn(self._process_socket, client)

    def _process_socket(self, client):
    """A greenlet for handling a single client."""
    inputTransport = self.inputTransportFactory.getTransport(client);
    outputTransport = self.outputTransportFactory.getTransport(client);
    inputProtocol = self.inputProtocolFactory.getProtocol(inputTransport);
    outputProtocol = self.outputProtocolFactory.getProtocol(outputTransport);

    try:
    while True:
    serviceNameMsg = inputProtocol.readMessageBegin();
    sname, stype, sseqid = serviceNameMsg;

    if stype == TMessageType.SERVICE_SELECTION:
    if sname in self.processors_:
    processorFactory = self.processors_[sname];
    processor = processorFactory.getProcessor(client);
    processor.process(inputProtocol, outputProtocol);

    else:
    outputProtocol.writeMessageBegin(sname, TMessageType.EXCEPTION, sseqid);
    x = TApplicationException(TApplicationException.UNKNOWN_METHOD, "Invalid service name: '" + sname + "'");
    x.write(outputProtocol);
    outputProtocol.writeMessageEnd();
    outputProtocol.trans.flush();

    else:
    #FIXME: don't know what to expect inside this message.
    #What to do now?
    x = TApplicationException(TApplicationException.INVALID_MESSAGE_TYPE, "Expected service selection (" + str(TMessageType.SERVICE_SELECTION) + "), but got: " + str(serviceNameMsg));
    outputProtocol.writeMessageBegin(sname, TMessageType.EXCEPTION, sseqid);

    x.write(outputProtocol);
    outputProtocol.writeMessageEnd();
    outputProtocol.trans.flush();

    inputProtocol.readMessageEnd();

    except TTransport.TTransportException, tx:
    pass;
    except Exception, x:
    logging.exception(x)

    inputTransport.close()
    outputTransport.close()
  3. imlucas revised this gist Apr 9, 2010. 1 changed file with 1 addition and 7 deletions.
    8 changes: 1 addition & 7 deletions thrift_gevent.py
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,4 @@
    import gevent

    from flam import Log
    from thrift.server.TServer import TServer
    # XXX Hackish, but should be safe: monkey patch gevent socket support into
    # Thrift. Overall I think this is cleaner than reimplementing all of TSocket.
    @@ -10,14 +8,10 @@

    class TGEventServer(TServer):
    """Gevent socket server."""

    log = Log()

    def serve(self):
    self.serverTransport.listen()
    while True:
    client = self.serverTransport.accept()
    self.log.debug('Accepted new client.')
    gevent.spawn(self._process_socket, client)

    def _process_socket(self, client):
    @@ -32,7 +26,7 @@ def _process_socket(self, client):
    except TTransportException, e:
    pass
    except Exception, e:
    self.log.exception(e)
    pass

    itrans.close()
    otrans.close()
  4. @alecthomas alecthomas created this gist Apr 9, 2010.
    38 changes: 38 additions & 0 deletions thrift_gevent.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    import gevent

    from flam import Log
    from thrift.server.TServer import TServer
    # XXX Hackish, but should be safe: monkey patch gevent socket support into
    # Thrift. Overall I think this is cleaner than reimplementing all of TSocket.
    from thrift.transport import TSocket; TSocket.socket = gevent.socket
    from thrift.transport.TTransport import TTransportException


    class TGEventServer(TServer):
    """Gevent socket server."""

    log = Log()

    def serve(self):
    self.serverTransport.listen()
    while True:
    client = self.serverTransport.accept()
    self.log.debug('Accepted new client.')
    gevent.spawn(self._process_socket, client)

    def _process_socket(self, client):
    """A greenlet for handling a single client."""
    itrans = self.inputTransportFactory.getTransport(client)
    otrans = self.outputTransportFactory.getTransport(client)
    iprot = self.inputProtocolFactory.getProtocol(itrans)
    oprot = self.outputProtocolFactory.getProtocol(otrans)
    try:
    while True:
    self.processor.process(iprot, oprot)
    except TTransportException, e:
    pass
    except Exception, e:
    self.log.exception(e)

    itrans.close()
    otrans.close()