/frameworks/tornado/app.py

https://github.com/klen/py-frameworks-bench · Python · 103 lines · 67 code · 35 blank · 1 comment · 3 complexity · 1c9762e2add3c8e1b9390ee8492ca5a9 MD5 · raw file

  1. import os
  2. HOST = os.environ.get('DHOST', '127.0.0.1')
  3. import signal
  4. import logging
  5. from tornado import web, gen, httpclient, httpserver, ioloop, template
  6. logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
  7. class JSONHandler(web.RequestHandler):
  8. def get(self):
  9. self.write({'message': 'Hello, World!'})
  10. class RemoteHandler(web.RequestHandler):
  11. @gen.coroutine
  12. def get(self):
  13. response = yield httpclient.AsyncHTTPClient().fetch('http://%s' % HOST)
  14. self.write(response.body)
  15. root = os.path.dirname(os.path.abspath(__file__))
  16. from sqlalchemy import create_engine, schema, Column
  17. from sqlalchemy.sql.expression import func
  18. from sqlalchemy.types import Integer, String
  19. from sqlalchemy.orm import sessionmaker
  20. from sqlalchemy.ext.declarative import declarative_base
  21. engine = create_engine('postgres://benchmark:benchmark@%s:5432/benchmark' % HOST, pool_size=10)
  22. metadata = schema.MetaData()
  23. Base = declarative_base(metadata=metadata)
  24. Session = sessionmaker(bind=engine)
  25. loader = template.Loader(os.path.join(root))
  26. class Message(Base):
  27. __tablename__ = 'message'
  28. id = Column(Integer, primary_key=True)
  29. content = Column(String(length=512))
  30. class CompleteHandler(web.RequestHandler):
  31. @gen.coroutine
  32. def get(self):
  33. session = Session()
  34. messages = list(session.query(Message).order_by(func.random()).limit(100))
  35. messages.append(Message(content='Hello, World!'))
  36. messages.sort(key=lambda m: m.content)
  37. response = loader.load('template.html').generate(messages=messages)
  38. session.close()
  39. self.write(response)
  40. app = web.Application(
  41. [
  42. web.url('/json', JSONHandler),
  43. web.url('/remote', RemoteHandler),
  44. web.url('/complete', CompleteHandler),
  45. ]
  46. )
  47. def sig_handler(sig, frame):
  48. logging.warning('Caught signal: %s', sig)
  49. loop = ioloop.IOLoop.instance()
  50. loop.add_callback(shutdown)
  51. def shutdown():
  52. logging.info('Stopping HTTP server.')
  53. loop = ioloop.IOLoop.instance()
  54. loop.stop()
  55. if os.path.exists('pid'):
  56. os.remove('pid')
  57. if __name__ == '__main__':
  58. logging.info('Starting HTTP server.')
  59. with open('pid', 'w') as f:
  60. f.write(str(os.getpid()))
  61. server = httpserver.HTTPServer(app)
  62. server.bind(5000, "0.0.0.0")
  63. server.start(2)
  64. signal.signal(signal.SIGTERM, sig_handler)
  65. signal.signal(signal.SIGINT, sig_handler)
  66. loop = ioloop.IOLoop.instance()
  67. loop.start()
  68. # pylama:ignore=E402