为什么即使设置 sys.setswitchinterval(1000) 也有多个线程工作

时间:2021-06-29 17:11:13

标签: python cpython gil

在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
...

1 个答案:

答案 0 :(得分:0)

join 的调用将等待目标线程完成执行 - 无论切换到那里需要多长时间。 在您打印 a 值时,每个线程都运行到完成。 如果您将 print 重新定位到 after t1.joint2.join 之前,您可能会看到延迟切换间隔导致的不平衡 - 但请记住,这绝不是方式可靠,这仅对实验目的有一定的价值。如果您真的想控制任务切换,请使用适当的方法,例如 Locks 和 Semaphore。