最近看《Go语言实战流媒体视频网站》视频想着用Python实现一遍,Web框架用了bottle
和gevent
,前面都很简单,只是在做并发控制上遇到了问题。
先后用了bottle自带的before_request
,after_request
以及plugin装饰器,都无法实现对并发的控制,又查不到相关资料只能自己搞定,经过观察和测试发现不论after_request还是plugin装饰器在执行完之后连接并没有断开。
只有当控制台输出下面内容的时候才是连接结束:
192.168.10.1 - - [2019-09-25 09:49:38] "GET /videos/1 HTTP/1.1" 200 1573087 0.040002
经过查看bottle
和gevent
源码,在gevent/pywsgi.py
中行958:
def handle_one_response(self):
"""
Invoke the application to produce one response.
This is called by :meth:`handle_one_request` after all the
state for the request has been established. It is responsible
for error handling.
"""
只有在执行完self.log_request()
之后整个连接才会结束,所以解决办法就是在bottle(仅限于server='gevent'
)中用handler_class=MyWSGIHandler
来指定个自己的类重写handle_one_response
方法进行连接控制。
但是该类相对比较底层,想要实现抛出HTTP信息得自己拼接协议,下面是一段精简代码:
目前只能想到这种方法解决,如果有更适合的方法我会继续补充。
另外就是在VSCode中Python插件调试gevent.monkey.patch_all()
的程序是需要在launch.json
中加入"gevent": true
,不然只能看到线程信息无法调试。
转载请注明: 本文《Python实现流媒体并发控制》来源于bstaint的博客
没有评论:
发表评论