Ham*_*ghi 7 python multithreading gil python-multithreading
我正在研究并试图了解 python GIL 和在 python 中使用多线程的最佳实践。我找到了这个演示文稿和这个视频
我试图重现演示文稿前 4 张幻灯片中提到的奇怪和疯狂的问题。这个问题老师在视频中也提到过(前4分钟)。我写了这个简单的代码来重现问题
from threading import Thread
from time import time
BIG_NUMBER = 100000
count = BIG_NUMBER
def countdown(n):
global count
for i in range(n):
count -= 1
start = time()
countdown(count)
end = time()
print('Without Threading: Final count = {final_n}, Execution Time = {exec_time}'.format(final_n=count, exec_time=end - start))
count = BIG_NUMBER
a = Thread(target=countdown, args=(BIG_NUMBER//2,))
b = Thread(target=countdown, args=(BIG_NUMBER//2,))
start = time()
a.start()
b.start()
a.join()
b.join()
end = time()
print('With Threading: Final count = {final_n}, Execution Time = {exec_time}'.format(final_n=count, exec_time=end - start))
Run Code Online (Sandbox Code Playgroud)
但是结果和论文和视频完全不一样!带线程和不带线程的执行时间几乎相同。有时这两种情况中的一种比另一种快一点。
这是我在使用多核架构处理器的 Windows 10 下使用 CPython 3.7.3 得到的结果。
Without Threading: Final count = 0, Execution Time = 0.02498459815979004
With Threading: Final count = 21, Execution Time = 0.023985862731933594
Run Code Online (Sandbox Code Playgroud)
另外我根据视频和论文的理解是 GIL 防止在两个核心中同时真正并行执行两个线程。所以如果这是真的,为什么最终的计数变量(在多线程情况下)不像预期的那样为零,并且在每次执行结束时可能是不同的数字,这可能是因为同时操作线程?在比视频和论文(使用 python 3.2)更新的 python 中,GIL 发生了什么变化会导致这些不同吗?提前致谢
Python 不是直接执行的。它首先被编译成所谓的Python 字节码。这个字节码在其思想上类似于原始汇编。字节码被执行。
GIL 的作用是不允许两个字节码指令并行运行。尽管某些操作(例如 io)确实会在内部释放 GIL 以在可以证明它不能破坏任何内容时允许真正的并发。
现在你需要知道的是count -= 1
它不会编译成单个字节码指令。它实际上编译成4条指令
LOAD_GLOBAL 1 (count)
LOAD_CONST 1 (1)
INPLACE_SUBTRACT
STORE_GLOBAL 1 (count)
Run Code Online (Sandbox Code Playgroud)
这大致意味着
load global variable into local variable
load 1 into local variable
subtract 1 from local variable
set global to the current local variable
Run Code Online (Sandbox Code Playgroud)
这些指令中的每一个都是原子的。但是顺序可以由线程混合,这就是为什么你会看到你所看到的。
那么 GIL 的作用是使执行流程串行化。意思指令一个接一个地发生,没有什么是平行的。因此,理论上当您运行多个线程时,它们将执行与单线程相同的操作,减去花费在(所谓的)上下文切换上的一些时间。我在 Python3.6 中的测试确认执行时间是相似的。
然而,在 Python2.7 中,我的测试显示线程的性能显着下降,大约 1.5 倍。我不知道这是什么原因。除了 GIL 之外的其他事情必须在后台发生。
归档时间: |
|
查看次数: |
1427 次 |
最近记录: |