一提到多线程通常你们的第一感受就是能够提高程序性能,在实际的操做中每每遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并非在任何状况下都能提高效率,在一些状况下偏偏相反,反而会下降程序的性能。这里给出两个简单的例子来讲明下:性能优化
程序1:多线程
1 import threading 2 from time import ctime 3 4 class MyThread(threading.Thread): 5 def __init__(self, func, args, name): 6 threading.Thread.__init__(self) 7 self.name = name 8 self.func = func 9 self.args = args 10 11 def run(self): 12 print 'starting', self.name, 'at:',ctime() 13 apply(self.func, self.args) 14 print self.name, 'finished at:', ctime() 15 16 def fun1(x): 17 y = 0 18 for i in range(x): 19 y+=1 20 21 def fun2(x): 22 y = 0 23 for i in range(x): 24 y+=1 25 26 def main(): 27 print 'staring single thread at:',ctime() 28 fun1(10000000) 29 fun2(10000000) 30 print 'finished single thread at:',ctime() 31 32 t1 = MyThread(fun1,(10000000,),fun1.__name__) 33 t2 = MyThread(fun2,(10000000,),fun2.__name__) 34 t1.start() 35 t2.start() 36 t1.join() 37 t2.join() 38 39 print 'all done' 40 41 if __name__ == '__main__': 42 main()
该程序执行结果为:并发
staring single thread at: Sat Dec 08 10:27:11 2012
finished single thread at: Sat Dec 08 10:27:14 2012
starting fun1 at: Sat Dec 08 10:27:14 2012
starting fun2 at: Sat Dec 08 10:27:14 2012
fun1 finished at:Sat Dec 08 10:27:21 2012
fun2 finished at:Sat Dec 08 10:27:21 2012
all doneapp
结果显示对于一样的问题多线程耗费了多一倍的时间,fun1,、fun2都是计算型程序,这就意味着两个代码都须要占用CPU资源,虽然采用了多线 程但CPU资源是惟一的(不考虑多CPU多核的状况),同一时刻只能一个线程使用,致使多线程没法真正的并发,相反因为线程的切换的开销,效率反而有明显 的降低。由此看以在单CPU的场景下对于计算密集型的程序,多线程并不能带来效率的提高。ide
程序2:性能
1 import threading 2 from time import ctime 3 4 class MyThread(threading.Thread): 5 def __init__(self, func, args, name): 6 threading.Thread.__init__(self) 7 self.name = name 8 self.func = func 9 self.args = args 10 11 def run(self): 12 print 'starting', self.name, 'at:',ctime() 13 apply(self.func, self.args) 14 print self.name, 'finished at:', ctime() 15 16 def fun1(x): 17 for i in range(x): 18 fd = open('1','w') 19 fd.close() 20 21 def fun2(x): 22 y = 0 23 for i in range(x): 24 y+=1 25 26 def main(): 27 print 'staring single thread at:',ctime() 28 fun1(15000) 29 fun2(50000000) 30 print 'finished single thread at:',ctime() 31 32 t1 = MyThread(fun1,(15000,),fun1.__name__) 33 t2 = MyThread(fun2,(50000000,),fun2.__name__) 34 t1.start() 35 t2.start() 36 t1.join() 37 t2.join() 38 39 print 'all done' 40 41 if __name__ == '__main__': 42 main()
该程序执行结果为:优化
staring single thread at: Sat Dec 08 11:03:30 2012
finished single thread at: Sat Dec 08 11:03:46 2012
starting fun1 at: Sat Dec 08 11:03:46 2012
starting fun2 at: Sat Dec 08 11:03:46 2012
fun2 finished at: Sat Dec 08 11:03:55 2012
fun1 finished at: Sat Dec 08 11:03:58 2012
all donespa
结果显示这个程序采用多线程比单线程的效率有明显的提高。这是因为fun1主要是文件的操做,fun2是计算操做,单线程的状况下,虽然两个程序主 要使用不一样的资源可是在线程内部只能串行执行,在IO操做的时候,CPU实际是无事可作。多线程的状况下,若是一个线程在等待IO操做,线程会立刻调度到 另一个线程上,并发的使用了不一样的资源。操作系统
结论:线程
线程自己因为建立和切换的开销,采用多线程不会提升程序的执行速度,反而会下降速度,可是对于频繁IO操做的程序,多线程能够有效的并发。
对于包含不一样任务的程序,能够考虑每一个任务使用一个线程。这样的程序在设计上相对于单线程作全部事的程序来讲,更为清晰明了,好比生产、消费者问题。
在实际的开发中对于性能优化的问题须要考虑到具体的场景来考虑是否使用多线程技术。