server_pg.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python
  2. import json
  3. from random import randint
  4. import momoko
  5. import tornado.ioloop
  6. import tornado.web
  7. from tornado import gen
  8. import tornado.options
  9. from tornado.options import options
  10. import tornado.httpserver
  11. from commons import JsonHandler, JsonHelloWorldHandler, PlaintextHelloWorldHandler, BaseHandler
  12. tornado.options.define('port', default=8888, type=int, help="Server port")
  13. tornado.options.define('postgres', default="localhost",
  14. type=str, help="PostgreSQL host")
  15. tornado.options.define('backlog', default=8192, type=int,
  16. help="Server backlog")
  17. class SingleQueryHandler(JsonHandler):
  18. SQL = "SELECT id, randomNumber FROM World WHERE id=%s"
  19. @gen.coroutine
  20. def get(self):
  21. random_id = randint(1, 10000)
  22. cursor = yield db.execute(self.SQL, (random_id,))
  23. row = cursor.fetchone()
  24. response = json.dumps({self.ID: row[0], self.RANDOM_NUMBER: row[1]})
  25. self.finish(response)
  26. class MultipleQueriesHandler(JsonHandler):
  27. SQL = "SELECT id, randomNumber FROM World WHERE id=%s"
  28. @gen.coroutine
  29. def get(self):
  30. queries = self.get_argument(self.QUERIES, "1")
  31. try:
  32. queries = int(queries.strip())
  33. except ValueError:
  34. queries = 1
  35. queries = min(max(1, queries), 500)
  36. worlds = []
  37. cursors = yield [db.execute(self.SQL, (randint(1, 10000),)) for _ in xrange(queries)]
  38. for cursor in cursors:
  39. row = cursor.fetchone()
  40. worlds.append({self.ID: row[0], self.RANDOM_NUMBER: row[1]})
  41. response = json.dumps(worlds)
  42. self.finish(response)
  43. application = tornado.web.Application([
  44. (r"/json", JsonHelloWorldHandler),
  45. (r"/plaintext", PlaintextHelloWorldHandler),
  46. (r"/db", SingleQueryHandler),
  47. (r"/queries", MultipleQueriesHandler)
  48. ],
  49. template_path="templates"
  50. )
  51. application.ui_modules = {}
  52. if __name__ == "__main__":
  53. tornado.options.parse_command_line()
  54. server = tornado.httpserver.HTTPServer(application)
  55. server.bind(options.port, backlog=options.backlog)
  56. server.start(0)
  57. ioloop = tornado.ioloop.IOLoop.instance()
  58. dsn = "user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world host=%s" % options.postgres
  59. db = momoko.Pool(dsn, size=100, max_size=200)
  60. ioloop.run_sync(db.connect)
  61. ioloop.start()