TOUVE 发表于 2015-11-30 08:53:13

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


  
页: [1]
查看完整版本: python 并发