在python3中,sys.getswitchinterval()
等于5ms,所以GIL会每5ms释放一次,还有一些I/O操作。我将 switchinterval 设置为 1000 秒,这意味着如果没有 I/O 操作,python 解释器将在 1000 秒内切换每个线程。在下面的代码中,我希望看到与 0 不同的值,因为 for 循环大约需要 10-15秒
为什么“a”与 0 不同?
from threading import Thread
import sys
sys.setswitchinterval(100000)
a=0
def increment(arg):
global a
for i in range(100000000):
a=a+arg
for _ in range(30):
t1=Thread(target=increment,args=(-1,))
t2=Thread(target=increment,args=(1,))
t1.start()
t2.start()
t1.join()
t2.join()
print(a)
a=0
output:
0
0
0
...
答案 0 :(得分:0)
对 join
的调用将等待目标线程完成执行 - 无论切换到那里需要多长时间。
在您打印 a
值时,每个线程都运行到完成。
如果您将 print
重新定位到 after t1.join
和 t2.join
之前,您可能会看到延迟切换间隔导致的不平衡 - 但请记住,这绝不是方式可靠,这仅对实验目的有一定的价值。如果您真的想控制任务切换,请使用适当的方法,例如 Locks 和 Semaphore。