计算量大的线程在 Python 中是 "hanging" 3 - 为什么会这样?

Computationally-heavy Thread is "hanging" in Python 3 - Why is that?

我对 Python 比较陌生,但对编码有点熟练。这段代码快把我逼疯了。为什么 summe() 方法在线程中如此顽固?线程似乎按顺序处理。这意味着,每个下一个线程只有在前一个线程结束时才会启动。我不知道为什么?所有四个线程都应启动 "parallelly" 并工作 "parallelly"。即使由于 GIL 的限制,它们 运行 仅在单个核心上。

与方法 count() 相同的过程按预期“并行”工作。

亲爱的互联网,请帮助我!…

保罗:)

#!/usr/bin/python3

import threading

# Hanging...
def summe(n):
    print("Start")
    s = sum(range(n))
    print("Done")

# Works like a charm
def count(n):
    print("Start")
    while n > 0:
        n = n-1
    print("Done")

# This works
for i in range(3):
    threading.Thread(target=count,args=(10000000000000,)).start()

# This hangs...
for i in range(3):
    threading.Thread(target=summe,args=(10000000000000,)).start()

由于 GIL,像 sum 这样的内置函数是原子的;一旦开始,在完成之前不会被打断。虽然线程系统可能 可能 在切换上下文以允许下一个线程启动之前选择仅执行 summe 的第一行,但这种可能性极小。您看到的 "hang" 是第一个线程中的 sum,直到它最终完成。

另一方面,在count中,没有一个长原子操作阻塞在GIL上;只是很多(还有很多很多......)小操作,这允许很多机会启动每个线程和 return 到主线程。使用更小的 n 值,您可以看到每个 count 线程启动,然后稍后它们将完成。同样,您可以几乎连续地观察三个 summe 线程 运行(在我 运行 的一个测试中,第一个 运行 在开始其他两个 运行ning 之前完成并行)。