记第一次用Go写程序解决Python性能问题

Go 学习有一段时间了,书还差一点没看完,一直没动手写代码。

场景:
近期客户抱怨我们给的数据导出工具太慢了,领导说看看能不能优化。

思考:
第一时间想到了用Go,因为学了一段时间,也想实战一下。
Go的速度是接近C/C++的,并发容易,且这个工具执行的任务都是一个个数据文件解析,独立无关联,适合用高并发的方式。
但我们这个工具是有界面的,用的PySide。全部用Go重写比较费时,而且网上看了一下,基本很少有用Go写GUI的,几个GUI库的文档也少,使用起来估计很费劲。
于是想到用Go写一个后台,数据导出工具来调用它,给它分发任务,由Go程序来执行。ZMQ的PUSH模式好像刚好符合。

解决:
数据导出工具开始执行任务后,调用Go程序,Go程序起动多个goroutine(可配置)作为Worker,连接ZMQ的PUSH服务,导出工具通过ZMQ给分发要处理的文件路径,保存路径,由Go程序来处理。Go程序即时发送回处理状态,进度 。
因为是两个不同的程序通讯,过程中要特别注意异常处理,恢复,确保可靠。

效果:
效率大幅提升,经测试原来花费182秒,现在只需12秒。基本保持15倍的提升,根据电脑状态波动,至少也在10倍以上。虽然Go比Python快不止15倍,受IO性能所限,也是没办法的。

缺点:
Go的库还是比Python少的多,本来这个导出工具有额外的数据处理功能(虽然客户说不用),但改版后这些额外的功能就去掉了(反正你说不用嘛)。因为这些功能用到了numpy, scipy等python库,Go好像没有这种库能替代。所以数据导出工具功能减少,性能提高,只做了解析保存文件的动作。

感想:
如果Go的库更丰富一些,完全可以用Python+Go来提升性能。
Python库丰富什么都能做,方便快捷。
Go的开发效率高,相比C来说,比较新的语言,编译快。由Go做一些耗时的任务,对于性能的提升是很值得的 。

猜你喜欢

转载自blog.csdn.net/wn0112/article/details/85337014