Skip to content

Instantly share code, notes, and snippets.

@alecthomas
Created April 9, 2010 04:08

Revisions

  1. alecthomas revised this gist Jun 21, 2010. 1 changed file with 3 additions and 5 deletions.
    8 changes: 3 additions & 5 deletions thrift_gevent.py
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,7 @@
    import logging

    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.
    @@ -11,13 +12,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 +30,7 @@ def _process_socket(self, client):
    except TTransportException, e:
    pass
    except Exception, e:
    self.log.exception(e)
    logging.exception('Thrift processor failure.')

    itrans.close()
    otrans.close()
  2. 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()