2016-08-26 45 views
4

我有下面的代码:Python的多线程VS多重VS顺序执行

  • 第一顺序执行ALONE(看注释代码和注释:

    import time 
    from threading import Thread 
    from multiprocessing import Process 
    
    def fun1(): 
    
    for _ in xrange(10000000): 
         print 'in fun1' 
         pass 
    
    def fun2(): 
    
    for _ in xrange(10000000): 
         print 'in fun2' 
         pass 
    
    def fun3(): 
    
    for _ in xrange(10000000): 
         print 'in fun3' 
         pass 
    
    def fun4(): 
    
    for _ in xrange(10000000): 
         print 'in fun4' 
         pass 
    
    if __name__ == '__main__': 
    
        #t1 = Thread(target=fun1, args=()) 
        t1 = Process(target=fun1, args=()) 
        #t2 = Thread(target=fun2, args=()) 
        t2 = Process(target=fun2, args=()) 
        #t3 = Thread(target=fun3, args=()) 
        t3 = Process(target=fun3, args=()) 
        #t4 = Thread(target=fun4, args=()) 
        t4 = Process(target=fun4, args=()) 
        t1.start() 
        t2.start() 
        t3.start() 
        t4.start() 
        start = time.clock() 
        t1.join() 
        t2.join() 
        t3.join() 
        t4.join() 
        end = time.clock() 
        print("Time Taken = ",end-start) 
    
        ''' 
        start = time.clock() 
        fun1() 
        fun2() 
        fun3() 
        fun4() 
        end = time.clock() 
        print("Time Taken = ",end-start) 
        ''' 
    

    我用三种方式运行上面的程序上面的代码)

  • 第二个多线程执行ALONE
  • 第三个多处理执行ALONE

为END_TIME启动时间的观察结果如下:

总体运行时间

  • ( '拍摄时间=',342.5981313667716)---由线程执行运行时间
  • ('拍摄时间=',232.94691744899296)---运行时间顺序执行
  • ( '拍摄时间=',307.91093406618216)由多重执行---运行时间

问:

我看到的顺序执行需要最少的时间和多线程具有最高的时间。为什么?我无法理解,也感到惊讶的结果。请澄清。

由于这是一项CPU密集型任务,并且获得了GIL,我的理解是 多处理时间最短,而线程执行时间最长。请验证我的理解。

回答

5

您使用time.clock,它给了你CPU时间而不是实时的:你不能在你的情况下使用它,因为它给你执行时间(你使用CPU运行你的代码多久了,这将会几乎同一时间,这些情况)

time.time()代替time.clock运行你的代码给了我这些时我的电脑上:

Process : ('Time Taken = ', 5.226783990859985) 
seq : ('Time Taken = ', 6.3122560000000005) 
Thread : ('Time Taken = ', 17.10062599182129) 

这里给出的任务(印刷)是如此之快,使用多处理的速度几乎与开销相平衡。

对于Threading,由于GIL只能运行一个线程,因此最终会按顺序运行所有函数,但是您有线程开销(每改变一次线程,每次迭代的花费可能会高达几毫秒) 。所以你最终会慢得多。

Threading是有用的,如果你有等待时间,所以你可以运行之间的任务。

Multiprocessing对于昂贵的计算任务非常有用,如果可能的话完全独立(无共享变量)。如果你需要共享变量,那么你必须面对GIL,这有点复杂(但大多数时候并非不可能)。

编辑:其实,使用time.clock像你一样给了你多少开销使用ThreadingMultiprocessing花费你的信息。

0

基本上你是对的。 你用什么平台来运行代码片段?我猜Windows。 请注意,“打印”不是CPU绑定所以你应该注释掉“打印”,并尝试在Linux上运行它来查看差异(它应该是你期望的)。 使用类似代码:

def fun1(): 

for _ in xrange(10000000): 
     # No print, and please run on linux 
     pass