欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask实现异步非阻塞请求功能实例解析

程序员文章站 2022-06-11 12:11:05
本文研究的主要是flask实现异步非阻塞请求功能,具体实现如下。 最近做物联网项目的时候需要搭建一个异步非阻塞的http服务器,经过查找资料,发现可以使用gevent包。...

本文研究的主要是flask实现异步非阻塞请求功能,具体实现如下。

最近做物联网项目的时候需要搭建一个异步非阻塞的http服务器,经过查找资料,发现可以使用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()这一条语句呢?在有详细的解释,这里简单说明一下:

monkey carefully replace functions and classes in the standard socket module with their cooperative counterparts. that way even the modules that are unaware of gevent can benefit from running in a multi-greenlet environment.

翻译:猴子补丁仔细的用并行代码副本替换标准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

总结

以上就是本文关于flask实现异步非阻塞请求功能实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!