Python实现流媒体并发控制

最近看《Go语言实战流媒体视频网站》视频想着用Python实现一遍,Web框架用了bottlegevent,前面都很简单,只是在做并发控制上遇到了问题。

先后用了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

经过查看bottlegevent源码,在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信息得自己拼接协议,下面是一段精简代码:

bottle_gevent_limit.py

目前只能想到这种方法解决,如果有更适合的方法我会继续补充。

另外就是在VSCode中Python插件调试gevent.monkey.patch_all()的程序是需要在launch.json中加入"gevent": true,不然只能看到线程信息无法调试。

没有评论: