gunicorn+gevent实现 flask web 应用的并行访问

来源:互联网 发布:windows磁盘碎片整理 编辑:程序博客网 时间:2024/04/30 11:54

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

多个进程处理请求,实现并发。

如果所有进程均卡住,那么服务就不可以用了。有同学知道这种情况怎么解决嘛?

1 0
原创粉丝点击