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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,这是一个关于 Python Web 框架性能对比以及如何使用 GunicornGevent 提高 Python Web 框架性能的问题。下面是我的回答: Python Web 框架性能对比 Python 有很多优秀的 Web 框架,如 Django、Flask、Tornado、Bottle 等等。这些框架都有自己的特点和优缺点,但是在性能方面却有所不同。下面是一些常见 Python Web 框架的性能对比数据: 框架 | Requests/s -----|---------- Flask| 673.24 Django| 372.77 Bottle| 3,040.36 Tornado| 3,714.29 从上表可以看出,Tornado 和 Bottle 性能比较突出,而 Django 和 Flask 的性能稍逊一些。但是这些数据并不是绝对的,实际性能还需要根据具体的应用场景和实现方式进行测试和评估。 使用 GunicornGevent 提高 Python Web 框架的性能 GunicornGevent 都是 Python Web 服务器,它们可以与常见的 Python Web 框架配合使用,提高 Web 应用的性能。 具体来说,Gunicorn 是一个使用 Python 编写的 WSGI HTTP 服务器,可以用于部署 Django、FlaskWeb 应用Gunicorn 使用多进程的方式来提高并发处理能力,可以根据系统的 CPU 核数来设置进程数,同时还支持异步处理和负载均衡等特性。 Gevent 是一个基于协程的 Python 网络库,可以用于编写高性能的网络应用程序。Gevent 可以与 Python Web 框架配合使用,使用协程来处理请求,可以显著提高 Web 应用的并发处理能力和响应速度。 下面是一个使用 GunicornGevent 提高 Flask Web 应用性能的示例代码: ``` python from gevent import monkey monkey.patch_all() from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, World!' if __name__ == '__main__': from gunicorn.app.base import BaseApplication from gunicorn.six import iteritems class StandaloneApplication(BaseApplication): def __init__(self, app, options=None): self.options = options or {} self.application = app super(StandaloneApplication, self).__init__() def load_config(self): config = dict([(key, value) for key, value in iteritems(self.options) if key in self.cfg.settings and value is not None]) for key, value in iteritems(config): self.cfg.set(key.lower(), value) def load(self): return self.application options = { 'bind': '0.0.0.0:8000', 'workers': 4, } StandaloneApplication(app, options).run() ``` 上面的代码使用了 GunicornGevent 来启动一个 Flask Web 应用,同时设置了 4 个 worker 进程来处理请求。这样可以显著提高 Web 应用的性能和并发处理能力。 希望这个回答对你有帮助!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值