我正在学习Python中的线程库。我不明白,如何并行运行两个线程?
这是我的Python程序:
无线程程序(fibsimple.py)
def fib(n):
if n < 2:
return n
else:
return fib(n-1) + fib(n-2)
fib(35)
fib(35)
print "Done"
运行时间:
$ time python fibsimple.py
Done
real 0m7.935s
user 0m7.922s
sys 0m0.008s
具有线程的相同程序(fibthread.py)
from threading import Thread
def fib(n):
if n < 2:
return n
else:
return fib(n-1) + fib(n-2)
t1 = Thread(target = fib, args = (35, ))
t1.start()
t2 = Thread(target = fib, args = (35, ))
t2.start()
t1.join()
t2.join()
print "Done"
运行时间:
$ time python fibthread.py
Done
real 0m12.313s
user 0m10.894s
sys 0m5.043s
我不明白为什么线程程序花费更多时间?如果线程并行运行,它应该几乎是一半。
但是如果我用多处理库实现相同的程序,时间就会减少一半。
多进程程序(fibmultiprocess.py)
from multiprocessing import Process
def fib(n):
if n < 2:
return n
else:
return fib(n-1) + fib(n-2)
p1 = Process(target = fib, args = (35, ))
p1.start()
p2 = Process(target = fib, args = (35, ))
p2.start()
p1.join()
p2.join()
print "Done"
运行时间
$ time python fibmultiporcess.py
Done
real 0m4.303s
user 0m8.065s
sys 0m0.007s
有人可以解释一下,如何并行运行线程吗?多处理和线程并行有何不同?任何帮助将不胜感激。
要解释多线程奇怪的运行时间,你必须知道GIL。
GIL 代表全局解释器锁,它旨在序列化从不同线程对解释器内部的访问。也就是说,解释器一次仅运行 ONE 线程。在多核系统上,这意味着多个线程无法有效地利用多个核心。
那是因为线程之间的切换消耗了额外的时间。
当然,由于使用多处理会创建多个解释器,因此它不受 GIL 的影响。这就是为什么速度可以达到预期的两倍。
Python 中多线程和多进程的良好比较链接
要了解有关 GIL 和其他一些实验的更多信息,请查看 理解 Python GIL - David Beazley。这是你能得到的最好的解释。
real 0m12.313s user 0m10.894s sys 0m5.043s
这表明系统调用花费了 5 秒。这表明在进程创建和上下文切换过程中花费了大量的时间。