1、 安装 gevent 和 gunicorn
pip install gevent
pip install gunicorn
2、 创建 gunicorn的配置文件(.py)
#!/usr/bin/env python #coding:utf-8
import multiprocessing
bind = "0.0.0.0:5000" #64-2048 backlog = 2048 workers = multiprocessing.cpu_count()*3 worker_class = "gevent" #同步响应最长处理时间 timeout = 60 pidfile = "/usr/local/bin/ gunicorn.pid" accesslog = "/var/log/ gunicorn_access.log" errorlog = "/var/log/error_msg.log" capture_output = True |
gunicorn 配置见
http://docs.gunicorn.org/en/stable/settings.html
3、 代码
3.1 仅gevent 时(server.py)
from gevent.wsgi import WSGIServer import gevent import multiprocessing from flask import Flask from flask.ext.restful import Api, Resource, reqparse
def api_construct(): app = Flask(__name__) @app.after_request def after_request(response): response.headers['Access-Control-Allow-Origin'] = '*' return response api = Api(app) api.add_resource(fun, '/v1/', endpoint = 'so') return app
def main(): #单进程。不能并行处理请求。 http_server = WSGIServer(('0.0.0.0',5000), api_construct(), spawn=2, environ={'wsgi.multiprocess': False}) http_server.serve_forever()
if __name__ == "__main__": main() |
python server.py 即可运行。
仅用gevent 时发现,并未实现并发,如果有一个 url 卡住,其它 url 也不能访问。网上说 gevent 可以实现并发,有哪位同学知道是怎么回事,欢迎留言交流。
3.2 改为 gunicorn+gevent方式:
from gevent.wsgi import WSGIServer import gevent import multiprocessing from flask import Flask from flask.ext.restful import Api, Resource, reqparse
def api_construct(): app = Flask(__name__) @app.after_request def after_request(response): response.headers['Access-Control-Allow-Origin'] = '*' return response api = Api(app) api.add_resource(fun, '/v1/', endpoint = 'so') return app
application = api_construct() |
gunicorn -c config.py server:application
多个进程处理请求,实现并发。
如果所有进程均卡住,那么服务就不可以用了。有同学知道这种情况怎么解决嘛?