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()

   

 

posted @ 2015-03-10 17:12  测试小开  阅读(1028)  评论(1编辑  收藏  举报