Skip to content

Instantly share code, notes, and snippets.

@imlucas
Forked from alecthomas/thrift_gevent.py
Created April 9, 2010 13:15
Show Gist options
  • Save imlucas/361144 to your computer and use it in GitHub Desktop.
Save imlucas/361144 to your computer and use it in GitHub Desktop.
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()
@alecthomas
Copy link

One issue with this is that it doesn't support multiplexing. That would require a more complex solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment