计算量大的线程在 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 之前完成并行)。
我对 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 之前完成并行)。