我有以下代码:
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)
'''
我用三种方式运行上面的程序:
- First Sequential Execution ALONE(查看注释代码,注释上面的代码)
- 单独执行第二个多线程
- 单独执行第三个多处理
end_time-start时间的观测值如下:
总运行时间
- ('Time Taken = ', 342.5981313667716) --- 线程执行 的运行时间
- ('Time Taken = ', 232.94691744899296) --- 顺序执行 的运行时间
- ('Time Taken = ', 307.91093406618216) --- 多处理执行 的运行时间
问题:
我看到顺序执行花费的时间最少,而多线程花费的时间最多。为什么?我无法理解,也对结果感到惊讶。请澄清。
由于这是一个 CPU 密集型任务并且获得了 GIL,所以我的理解是 多处理将花费最少的时间,而线程执行将花费最多的时间。请验证我的理解。
最佳答案
你使用 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,您只能运行一个线程,因此您最终会按顺序运行所有函数,但是您有线程的开销(每隔几次迭代更改线程可能会增加成本每次几毫秒)。所以你最终得到的东西要慢得多。
线程
在您有等待时间时很有用,因此您可以在两者之间运行任务。
Multiprocessing
对于计算量大的任务很有用,如果可能完全独立(无共享变量)。如果您需要共享变量,那么您必须面对 GIL,它会稍微复杂一点(但大多数情况下并非不可能)。
编辑:实际上,像您一样使用 time.clock
可以让您了解使用 Threading
和 Multiprocessing
的开销有多少。
关于Python 多线程与多处理与顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39159438/