python 并发
由于要处理大量的数据比对,发现python多线程并不能提高cpu的使用,不管开几个线程,cpu也就是100%左右;
GIL 的迷思:痛并快乐着
GIL 的全程为 Global Interpreter Lock ,意即全局解释器锁。在 Python 语言的主流实现 CPython 中,GIL 是一个货真价实的全局线程锁,在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行(这个次数可以通过 sys.setcheckinterval 来调整)。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython 进程做为一个整体,同一时间只会有一个获得了 GIL 的线程在跑,其它的线程都处于等待状态等着 GIL 的释放。这也就解释了我们两个死循环的实验结果:虽然有两个死循环的线程,而且有两个物理 CPU 内核,但因为 GIL 的限制,两个线程只是做着分时切换,总的 CPU 占用率还略低于 50%。
好在python2.6引入了多进程。测试发现处理性能有明显提升,但是进程多了,又受其他资源限制,例如io等,还是不要太贪心哦。。。。
#encoding=utf-8 import multiprocessing import time import os 测试多进程创建空文件夹性能 def dead_circle(): for i in range(3000): fp=open('process'+str(i),'w') fp.truncate() fp.close() if __name__=='__main__': os.chdir('E:\\') if os.path.exists('process'): pass else: os.mkdir('process') os.chdir('process') print os.getcwd() #打印开始时间 print time.ctime() #进程个数,目前设置4 pool=multiprocessing.Pool(processes=4) for i in range(10): pool.apply_async(dead_circle,()) pool.close() pool.join() #打印结束时间 print time.ctime()