zoukankan      html  css  js  c++  java
  • Flask实现异步非阻塞请求功能

    pip install gevent
    

      

    关于gevent

    Gevent 是一个 Python 并发网络库,它使用了基于 libevent 事件循环的 greenlet 来提供一个高级同步 API。下面是代码示例:

    from gevent.wsgi import WSGIServer
    from yourapplication import app
    
    http_server = WSGIServer(('', 5000), app)
    http_server.serve_forever()
    

      

    代码清单

    下面放上Flask异步非阻塞的代码清单,以后需要用到的时候直接移植即可。

    # coding=utf-8
    # Python Version: 3.5.1
    
    # Flask
    from flask import Flask, request, g
    
    # gevent
    from gevent import monkey
    from gevent.pywsgi import WSGIServer
    monkey.patch_all()
    # gevent end
    
    import time
    
    app = Flask(__name__)
    app.config.update(DEBUG=True)
    
    @app.route('/asyn/', methods=['GET'])
    def test_asyn_one():
        print("asyn has a request!")
        time.sleep(10)
        return 'hello asyn'
    
    
    @app.route('/test/', methods=['GET'])
    def test():
        return 'hello test'
    
    
    if __name__ == "__main__":
        # app.run()
        http_server = WSGIServer(('', 5000), app)
        http_server.serve_forever()

    关于monkey.patch_all()

    为什么要加monkey.patch_all()这一条语句呢?在gevnet的官网有详细的解释,这里简单说明一下:

    猴子补丁仔细的用并行代码副本替换标准socket模块的函数和类,这种方式可以使模块在不知情的情况下让gevent更好的运行于multi-greenlet环境中。

    测试

    打开浏览器,首先请求http://127.0.0.1:5000/asyn/,然后 
    再请求http://127.0.0.1:5000/test/这个接口十次。如果是一般的Flask框架,后面的接口是没有响应的。

    打印内容如下:

    asyn has a request!
    127.0.0.1 - - [2016-10-24 20:45:10] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:11] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:11] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:12] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:12] "GET /test/ HTTP/1.1" 200 126 0.000998
    127.0.0.1 - - [2016-10-24 20:45:13] "GET /test/ HTTP/1.1" 200 126 0.001001
    127.0.0.1 - - [2016-10-24 20:45:14] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:14] "GET /test/ HTTP/1.1" 200 126 0.001014
    127.0.0.1 - - [2016-10-24 20:45:15] "GET /test/ HTTP/1.1" 200 126 0.001000
    127.0.0.1 - - [2016-10-24 20:45:15] "GET /test/ HTTP/1.1" 200 126 0.000000
    127.0.0.1 - - [2016-10-24 20:45:18] "GET /asyn/ HTTP/1.1" 200 126 10.000392
    

      

  • 相关阅读:
    【CF103D】Time to Raid Cowavans-分块+离线处理
    【BZOJ3992】序列统计(SDOI2015)-NTT+循环卷积+快速幂
    【BZOJ3527】力(ZJOI2014)-FFT
    【HDU4609】3-idiots-FFT+生成函数
    【LuoguP3803】多项式乘法-FFT/NTT模板题(附带FFT/NTT简单介绍)
    网络流24题解题总结(更新中)
    【BZOJ3531】旅行(SDOI2014)-树链剖分+动态加点线段树
    [Noip2012]借教室
    bzoj3394:[Usaco2009 Jan]Best Spot 最佳牧场
    [NOIP2014]无线网站发射器选址
  • 原文地址:https://www.cnblogs.com/sunlong88/p/9623851.html
Copyright © 2011-2022 走看看