Browse Source

updated wheezy.web to run on Gunicorn and Meinheld

Keith Newman 10 years ago
parent
commit
4ae66bb4db

+ 88 - 89
frameworks/Python/wheezyweb/app.py

@@ -22,6 +22,8 @@ from sqlalchemy import create_engine, Column
 from sqlalchemy.types import String, Integer, Unicode
 from sqlalchemy.types import String, Integer, Unicode
 from sqlalchemy.orm import sessionmaker
 from sqlalchemy.orm import sessionmaker
 
 
+from meinheld import server
+
 DBDRIVER = 'mysql'
 DBDRIVER = 'mysql'
 DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
 DBHOSTNAME = os.environ.get('DBHOST', 'localhost')
 DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
 DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@%s:3306/hello_world?charset=utf8' % (DBDRIVER, DBHOSTNAME)
@@ -32,120 +34,117 @@ Session = sessionmaker(bind=db_engine)
 db_session = Session()
 db_session = Session()
 
 
 if sys.version_info[0] == 3:
 if sys.version_info[0] == 3:
-	xrange = range
+    xrange = range
 
 
 def getQueryNum(queryString):
 def getQueryNum(queryString):
-  try:
-    int(queryString)
-    return int(queryString)
-  except ValueError:
-    return 1
+    try:
+        int(queryString)
+        return int(queryString)
+    except ValueError:
+        return 1
 
 
 class Fortune(Base):
 class Fortune(Base):
-  __tablename__ = "Fortune"
-  id = Column(Integer, primary_key=True)
-  message = Column(String)
+    __tablename__ = "Fortune"
+    id = Column(Integer, primary_key=True)
+    message = Column(String)
 
 
-  def serialize(self):
-    return {
-      'id': self.id,
-      'randomNumber': self.randomNumber,
-    }
+    def serialize(self):
+        return {
+            'id': self.id,
+            'randomNumber': self.randomNumber,
+        }
 
 
 class World(Base):
 class World(Base):
-  __tablename__ = "World"
-  id = Column(Integer, primary_key=True)
-  randomNumber = Column(Integer)
-  def serialize(self):
-    return {
-      'id': self.id,
-      'randomNumber': self.randomNumber,
-    }
+    __tablename__ = "World"
+    id = Column(Integer, primary_key=True)
+    randomNumber = Column(Integer)
+    def serialize(self):
+        return {
+            'id': self.id,
+            'randomNumber': self.randomNumber,
+        }
 
 
 class JsonHandler(BaseHandler):
 class JsonHandler(BaseHandler):
-  def get(self):
-    return self.json_response({"message": "Hello, world!"})
+    def get(self):
+        return self.json_response({"message": "Hello, world!"})
 
 
 class DbHandler(BaseHandler):
 class DbHandler(BaseHandler):
-  def get(self):
-    db_engine.connect()
-    wid = randint(1, 10000)
-    world = db_session.query(World).get(wid).serialize()
-    return self.json_response(world)
+    def get(self):
+        db_engine.connect()
+        wid = randint(1, 10000)
+        world = db_session.query(World).get(wid).serialize()
+        return self.json_response(world)
 
 
 class QueriesHandler(BaseHandler):
 class QueriesHandler(BaseHandler):
-  def get(self):
-    queries = self.request.get_param("queries")
-    num_queries = getQueryNum(queries)
-    if num_queries < 1:
-      num_queries = 1
-    if num_queries > 500:
-      num_queries = 500
-    rp = partial(randint, 1, 10000)
-    get = db_session.query(World).get
-    worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
-    return self.json_response(worlds)
+    def get(self):
+        queries = self.request.get_param("queries")
+        num_queries = getQueryNum(queries)
+        if num_queries < 1:
+            num_queries = 1
+        if num_queries > 500:
+            num_queries = 500
+        rp = partial(randint, 1, 10000)
+        get = db_session.query(World).get
+        worlds = [get(rp()).serialize() for _ in xrange(num_queries)]
+        return self.json_response(worlds)
 
 
 class UpdatesHandler(BaseHandler):
 class UpdatesHandler(BaseHandler):
-  def get(self):
-    queries = self.request.get_param("queries")
-    num_queries = getQueryNum(queries)
-    if num_queries < 1:
-      num_queries = 1
-    if num_queries > 500:
-      num_queries = 500
-    worlds = []
-    rp = partial(randint, 1, 10000)
-    ids = [rp() for _ in xrange(num_queries)]
-    ids.sort() # To avoid deadlock
-    for id in ids:
-      world = db_session.query(World).get(id)
-      world.randomNumber = rp()
-      worlds.append(world.serialize())
-    return self.json_response(worlds)
+    def get(self):
+        queries = self.request.get_param("queries")
+        num_queries = getQueryNum(queries)
+        if num_queries < 1:
+            num_queries = 1
+        if num_queries > 500:
+            num_queries = 500
+        worlds = []
+        rp = partial(randint, 1, 10000)
+        ids = [rp() for _ in xrange(num_queries)]
+        ids.sort() # To avoid deadlock
+        for id in ids:
+            world = db_session.query(World).get(id)
+            world.randomNumber = rp()
+            worlds.append(world.serialize())
+        return self.json_response(worlds)
 
 
 class FortuneHandler(BaseHandler):
 class FortuneHandler(BaseHandler):
-  def get(self):
-    fortunes = db_session.query(Fortune).all()
-    fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
-    fortunes.sort(key=attrgetter("message"))
-    engine = Engine(loader=FileLoader(["views"]), extensions=[CoreExtension()])
-    template = engine.get_template("fortune.html")
-    for f in fortunes:
-      f.message = bleach.clean(f.message)
-    template_html = template.render({"fortunes": fortunes})		
+    def get(self):
+        fortunes = db_session.query(Fortune).all()
+        fortunes.append(Fortune(id=0, message="Additional fortune added at request time."))
+        fortunes.sort(key=attrgetter("message"))
+        engine = Engine(loader=FileLoader(["views"]), extensions=[CoreExtension()])
+        template = engine.get_template("fortune.html")
+        for f in fortunes:
+            f.message = bleach.clean(f.message)
+        template_html = template.render({"fortunes": fortunes})		
+
+        response = HTTPResponse()
+        response.write(template_html)
+        return response
 
 
+def plaintext(request):
     response = HTTPResponse()
     response = HTTPResponse()
-    response.write(template_html)
+    response.write("Hello, world!")
     return response
     return response
 
 
-def plaintext(request):
-	response = HTTPResponse()
-	response.write("Hello, world!")
-	return response
-
 all_urls = [
 all_urls = [
-  url("plaintext", plaintext, name="plaintext"),
-  url("json", JsonHandler, name="json"),
-  url("db", DbHandler, name="db"),
-  url("queries", QueriesHandler, name="queries"),
-  url("updates", UpdatesHandler, name="updates"),
-  url("fortune", FortuneHandler, name="fortune")
+    url("plaintext", plaintext, name="plaintext"),
+    url("json", JsonHandler, name="json"),
+    url("db", DbHandler, name="db"),
+    url("queries", QueriesHandler, name="queries"),
+    url("updates", UpdatesHandler, name="updates"),
+    url("fortune", FortuneHandler, name="fortune")
 ]
 ]
 
 
 options = {}
 options = {}
 
 
-main = WSGIApplication(
-  middleware = [
-    bootstrap_defaults(url_mapping=all_urls),
-    path_routing_middleware_factory
-  ],
-  options = options
+app = WSGIApplication(
+    middleware = [
+        bootstrap_defaults(url_mapping=all_urls),
+        path_routing_middleware_factory
+    ],
+    options = options
 )
 )
 
 
-if __name__ == "__main__":
-  from wsgiref.simple_server import make_server
-  try:
-    make_server("", 8080, main).serve_forever()
-  except KeyboardInterrupt:
-    pass
+if __name__ == '__main__':
+    server.listen(("127.0.0.1", 8080))
+    server.run(app)

+ 2 - 0
frameworks/Python/wheezyweb/bash_profile.sh

@@ -1,7 +1,9 @@
 export PY2_ROOT=$IROOT/py2
 export PY2_ROOT=$IROOT/py2
 export PY2=$PY2_ROOT/bin/python
 export PY2=$PY2_ROOT/bin/python
 export PY2_PIP=$PY2_ROOT/bin/pip
 export PY2_PIP=$PY2_ROOT/bin/pip
+export PY2_GUNICORN=$PY2_ROOT/bin/gunicorn
 
 
 export PY3_ROOT=$IROOT/py3
 export PY3_ROOT=$IROOT/py3
 export PY3=$PY3_ROOT/bin/python3
 export PY3=$PY3_ROOT/bin/python3
 export PY3_PIP=$PY3_ROOT/bin/pip3
 export PY3_PIP=$PY3_ROOT/bin/pip3
+export PY3_GUNICORN=$PY3_ROOT/bin/gunicorn

+ 2 - 2
frameworks/Python/wheezyweb/benchmark_config

@@ -16,7 +16,7 @@
       "framework": "wheezy.web",
       "framework": "wheezy.web",
       "language": "Python",
       "language": "Python",
       "orm": "Full",
       "orm": "Full",
-      "platform": "wheezy.web",
+      "platform": "Meinheld",
       "webserver": "None",
       "webserver": "None",
       "os": "Linux",
       "os": "Linux",
       "database_os": "Linux",
       "database_os": "Linux",
@@ -38,7 +38,7 @@
       "framework": "wheezy.web",
       "framework": "wheezy.web",
       "language": "Python",
       "language": "Python",
       "orm": "Full",
       "orm": "Full",
-      "platform": "wheezy.web",
+      "platform": "Meinheld",
       "webserver": "None",
       "webserver": "None",
       "os": "Linux",
       "os": "Linux",
       "database_os": "Linux",
       "database_os": "Linux",

+ 25 - 0
frameworks/Python/wheezyweb/gunicorn_conf.py

@@ -0,0 +1,25 @@
+import multiprocessing
+import os
+import sys
+
+_is_pypy = hasattr(sys, 'pypy_version_info')
+_is_travis = os.environ.get('TRAVIS') == 'true'
+
+workers = multiprocessing.cpu_count() * 3
+if _is_travis:
+    workers = 2
+
+bind = "0.0.0.0:8080"
+keepalive = 120
+errorlog = '-'
+pidfile = 'gunicorn.pid'
+
+if _is_pypy:
+    worker_class = "tornado"
+else:
+    worker_class = "meinheld.gmeinheld.MeinheldWorker"
+
+    def post_fork(server, worker):
+        # Disalbe access log
+        import meinheld.server
+        meinheld.server.set_access_logger(None)

+ 6 - 0
frameworks/Python/wheezyweb/requirements.txt

@@ -1,6 +1,12 @@
 wheezy.web==0.1.469
 wheezy.web==0.1.469
 wheezy.template==0.1.159
 wheezy.template==0.1.159
+
 bleach==1.4.1
 bleach==1.4.1
+
 SQLAlchemy==0.9.9
 SQLAlchemy==0.9.9
 mysqlclient==1.3.6
 mysqlclient==1.3.6
 
 
+gunicorn==19.3.0
+meinheld==0.5.7
+
+greenlet==0.4.5

+ 1 - 1
frameworks/Python/wheezyweb/setup.sh

@@ -1,3 +1,3 @@
 #!/bin/bash
 #!/bin/bash
 
 
-$PY2 app.py &
+$PY2_GUNICORN app:app -c gunicorn_conf.py &

+ 1 - 1
frameworks/Python/wheezyweb/setup_py3.sh

@@ -1,3 +1,3 @@
 #!/bin/bash
 #!/bin/bash
 
 
-$PY3 app.py &
+$PY3_GUNICORN app:app -c gunicorn_conf.py &