High performance asynchronous Python WSGI Web Server
Project description
What’s this
This is a high performance python wsgi web server.
And Meinheld is a WSGI compliant web server. (PEP333 and PEP3333 supported)
You can also join us in meinheld mailing list.
Requirements
Meinheld requires Python 2.x >= 2.6 or Python 3.x >= 3.5 . and greenlet >= 0.4.5.
Meinheld supports Linux, FreeBSD, and macOS.
Installation
Install from pypi:
$ pip install -U meinheld
Install from source:
$ python setup.py install
Meinheld also supports working as a gunicorn worker.
To install gunicorn:
$ pip install -U gunicorn
Basic Usage
simple wsgi app:
from meinheld import server
def hello_world(environ, start_response):
status = b'200 OK'
res = b"Hello world!"
response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(res)))]
start_response(status, response_headers)
return [res]
server.listen(("0.0.0.0", 8000))
server.run(hello_world)
with gunicorn. user worker class “egg:meinheld#gunicorn_worker” or “meinheld.gmeinheld.MeinheldWorker”:
$ gunicorn --workers=2 --worker-class="egg:meinheld#gunicorn_worker" gunicorn_test:app
Continuation
NOTE: This feature is deprecated and will be removed in 2.0
Meinheld provides a simple continuation API (based on greenlet).
To enable continuations, use ContinuationMiddleware. get Continuation from wsgi environ.
Continuation objects have two very interesting methods, suspend and resume.
For example:
from meinheld import server
from meinheld import middleware
def app(environ, start_response):
...
#get Continuation
c = environ.get(middleware.CONTINUATION_KEY, None)
...
if condtion:
waiters.append(c)
#suspend
c.suspend()
else:
for c in waiters:
# resume suspend function
c.resume()
...
server.listen(("0.0.0.0", 8000))
server.run(middleware.ContinuationMiddleware(hello_world))
For more info see http://github.com/mopemope/meinheld/tree/master/example/chat/
Websocket
NOTE: This feature is deprecated and will be removed in 2.0
Meinheld support Websockets. use WebSocketMiddleware.
For example:
from flask import Flask, render_template, request
from meinheld import server, middleware
SECRET_KEY = 'development key'
DEBUG=True
app = Flask(__name__)
app.config.from_object(__name__)
participants = set()
@app.route('/')
def index():
return render_template('websocket_chat.html')
@app.route('/chat')
def chat():
print request.environ
ws = request.environ.get('wsgi.websocket')
participants.add(ws)
try:
while True:
print "ws.wait()..."
m = ws.wait()
print "recv msg %s" % m
if m is None:
break
for p in participants:
print "send message %s" % m
p.send(m)
finally:
participants.remove(ws)
return ""
if __name__ == "__main__":
server.listen(("0.0.0.0", 8000))
server.run(middleware.WebSocketMiddleware(app))
Patching
NOTE: This feature is deprecated and will be removed in 2.0
Meinheld provides a few monkeypatches.
Socket
This patch replaces the standard socket module.
For Example:
from meinheld import patch
patch.patch_all()
For more info see http://github.com/mopemope/meinheld/tree/master/example/patch/
Performance
For parsing HTTP requests, Meinheld uses Ryan Dahl’s http-parser library.
(see https://github.com/joyent/http-parser)
It is built around the high performance event library picoev.
(see http://developer.cybozu.co.jp/kazuho/2009/08/picoev-a-tiny-e.html)
Sendfile
Meinheld uses sendfile(2), over wgsi.file_wrapper.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file meinheld-1.0.2.tar.gz
.
File metadata
- Download URL: meinheld-1.0.2.tar.gz
- Upload date:
- Size: 83.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.3.1 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.8.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 008c76937ac2117cc69e032dc69cea9f85fc605de9bac1417f447c41c16a56d6 |
|
MD5 | ae7cd32464bbea7bba0ace1fddd9c1c0 |
|
BLAKE2b-256 | a641f11e4dbfe35f251b1fe10cee5b186a4ac29de3e03fede010db40313d829e |