最近看《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的博客
没有评论:
发表评论