server.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/env python
  2. import sys
  3. import json
  4. from random import randint
  5. import momoko
  6. import motor
  7. import tornado.ioloop
  8. import tornado.web
  9. from tornado import gen
  10. import tornado.options
  11. from tornado.options import options
  12. import tornado.httpserver
  13. PY3 = False
  14. if sys.version_info[0] == 3:
  15. PY3 = True
  16. xrange = range
  17. tornado.options.define('port', default=8888, type=int, help="Server port")
  18. tornado.options.define('mongo', default='localhost', type=str, help="MongoDB host")
  19. tornado.options.define('postgres', default=None, type=str, help="PostgreSQL host")
  20. class BaseHandler(tornado.web.RequestHandler):
  21. def compute_etag(self):
  22. return None
  23. class JsonSerializeTestHandler(BaseHandler):
  24. def get(self):
  25. obj = {"message": "Hello, World!", }
  26. self.write(obj)
  27. class PlaintextHandler(BaseHandler):
  28. def get(self):
  29. self.set_header('Content-Type', 'text/plain')
  30. self.write(b"Hello, World!")
  31. class DBTestHandler(BaseHandler):
  32. @gen.coroutine
  33. def get(self):
  34. world = yield db.World.find_one(randint(1, 10000))
  35. # Get first postion on arguments, and so first postion in mongo return
  36. world['id'] = int(world.pop('_id'))
  37. world['randomNumber'] = int(world['randomNumber'])
  38. response = json.dumps(world)
  39. self.set_header("Content-Type", "application/json; charset=UTF-8")
  40. self.write(response)
  41. class QueryTestHandler(BaseHandler):
  42. @gen.coroutine
  43. def get(self):
  44. try:
  45. queries = int(self.get_argument("queries"))
  46. except Exception:
  47. queries = 1
  48. else:
  49. if queries < 1:
  50. queries = 1
  51. elif queries > 500:
  52. queries = 500
  53. worlds = yield [db.World.find_one(randint(1, 10000))
  54. for _ in xrange(queries)]
  55. for world in worlds:
  56. # Get first postion on arguments, and so first postion in mongo return
  57. world['id'] = int(world.pop('_id'))
  58. world['randomNumber'] = int(world['randomNumber'])
  59. response = json.dumps(worlds)
  60. self.set_header("Content-Type", "application/json; charset=UTF-8")
  61. self.write(response)
  62. class QueryPostgresRawTestHandler(BaseHandler):
  63. @gen.coroutine
  64. def get(self):
  65. sql = "SELECT id, randomNumber FROM World WHERE id=%s"
  66. random_id = randint(1, 10000)
  67. cursor = yield self.application.db.execute(sql, (random_id,))
  68. row = cursor.fetchone()
  69. response = json.dumps({"id": row[0], "randomNumber": row[1]})
  70. self.set_header("Content-Type", "application/json; charset=UTF-8")
  71. self.write(response)
  72. class MultipleQueriesPostgresRawTestHandler(BaseHandler):
  73. @gen.coroutine
  74. def get(self):
  75. queries = self.get_argument("queries", "1")
  76. try:
  77. queries = int(queries.strip())
  78. except ValueError:
  79. queries = 1
  80. queries = min(max(1, queries), 500)
  81. sql = "SELECT id, randomNumber FROM World WHERE id=%s"
  82. cursors = yield [self.application.db.execute(sql, (randint(1, 10000),)) for _ in xrange(int(queries))]
  83. rows = [cursor.fetchone() for cursor in cursors]
  84. worlds = [{"id": row[0], "randomNumber":row[1]} for row in rows]
  85. response = json.dumps(worlds)
  86. self.set_header("Content-Type", "application/json; charset=UTF-8")
  87. self.write(response)
  88. application = tornado.web.Application([
  89. (r"/json", JsonSerializeTestHandler),
  90. (r"/plaintext", PlaintextHandler),
  91. (r"/db", DBTestHandler),
  92. (r"/queries", QueryTestHandler),
  93. (r"/dbraw", QueryPostgresRawTestHandler),
  94. (r"/queriesraw", MultipleQueriesPostgresRawTestHandler)
  95. ])
  96. if __name__ == "__main__":
  97. tornado.options.parse_command_line()
  98. server = tornado.httpserver.HTTPServer(application)
  99. server.bind(options.port)
  100. server.start(0)
  101. ioloop = tornado.ioloop.IOLoop.instance()
  102. if options.postgres:
  103. dsn = "user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world host=%s" % options.postgres
  104. application.db = momoko.Pool(dsn, size=1, max_size=100)
  105. ioloop.run_sync(application.db.connect)
  106. else:
  107. db = motor.MotorClient(options.mongo).hello_world
  108. ioloop.start()