解决flask慢的问题,以及开启多线程之后jpype的错误

用 flask 做 API 时,发现在 client 的请求需要很长的时间才能得到响应(差不多要 20 多秒)。Google 之后得到解决方案,使用配置

1
app.run(threaded=True)

开启多线程模式。

然而这个服务是使用 java 做的底层,用 jpype 让 python 能调用 java 的方法。flask 开启多线程之后服务报错。经过研究发现是 JVM 并没有能为新开启的线程提供服务。查阅 jpype 的文档,找到 python 线程相关部分:http://jpype.sourceforge.net/doc/user-guide/userguide.html#python_threads

因此可在调用 java class 前加上一个判断语句:

1
2
if not jpype.isThreadAttachedToJVM():
jpype.attachThreadToJVM()

使用 isTreadAttachedToJVM 先做出判断,然后使用 attachThreadToJVM 让 JVM 能为新线程提供服务。

完成上述步骤之后,发现已经没有报错了,但是相应速度依然很慢。从服务端控制台看,早已返回了 200,但是在浏览器中迟迟收不到数据,一直是 Pending 状态。查阅资料发现 flask 默认开启 Debug 模式,会对 response 做大量分析记录,使用配置

1
app.run(debug=False)

关闭 Debug 模式,再连接发现响应时间大大减小了,从 20 多秒减到了几百毫秒。