最近上的项目有TPS要求,串行代码不满足当前需求,需要改成多线程,就查了下Python的多线程,不查不知道,一查吓一跳.
第一,Python是一种动态语言,我的理解是,运行到某一行的时候,才是知道编译成机器码,而不行C、JAVA等 静态语言那样事先编译好再运行,这有一个显著的问题:运行效率低
第二,Python有一个GIL,全称,全局解释器锁,为了解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,就是因为这个超级大锁的存在,某一个线程运行的时候,其他线程处于阻塞状态,这将严重影响多线程执行效率,甚至可以认为Python就是个单线程的程序。有时候用多线程的解决方案甚至比串行代码还要慢。
第三,引入多线程之后,安装的pylucene报错:RuntimeError: attachCurrentThread() must be called first,大致意思是在启动线程时候没绑定线程,解决办法如下:
vm_env = lucene.initVM(vmargs=['-Djava.awt.headless=true'])#启动Lucene的时候添加
vm_env.attachCurrentThread()#绑定线程
vm_env.detachCurrentThread()#销毁线程
没发现问题,当压力测试的时候,处理速度确实提升上去了,但发现一个问题:内存使用量只涨不消,运行4mins,程序崩溃,一步步查找问题,一开始就认为是pylucene的原因,于是&#