什么';如果将Check Interval设置为100000,那么新旧GIL(Python3.2之前/之后)之间的区别是什么?

什么';如果将Check Interval设置为100000,那么新旧GIL(Python3.2之前/之后)之间的区别是什么?,python,multithreading,gil,Python,Multithreading,Gil,我试图找到新旧GIL之间的差异,使用Python2.6.4和Python3.2,基于。我运行了下面的线程代码 import time import threading import dis def f(a, N): for i in range(N): a[i%3]+= i def main(): a1= [1, 2, 3] a2= [4, 5, 6] m= 1000*1000 N= 50 for i in range(5,

我试图找到新旧GIL之间的差异,使用Python2.6.4和Python3.2,基于。我运行了下面的线程代码

import time
import threading
import dis

def f(a, N):
    for i in range(N):
        a[i%3]+= i

def main():
    a1= [1, 2, 3]
    a2= [4, 5, 6]
    m= 1000*1000
    N= 50

    for i in range(5, N + 1, 5):        
        t1= threading.Thread(target=f, args=(a1, i * m))
        t2= threading.Thread(target=f, args=(a2, i * m))

        start_time = time.time()

        t1.start()
        t2.start()
        t1.join()
        t2.join()

        end_time = time.time()
        print(2 * i * m, end_time - start_time)

main()
得到了一些结果,如下图所示。(图中提到的顺序代码与上面的线程代码类似,但它是单线程的,所以我不在这里包括它)

在Python2上运行sys.setcheckinterval(100000)时,检查间隔从默认值100更改为100000。有了这个变化,2.6.4版本的多核CPU上的线程代码的性能会更好。事实上,它与运行3.2没有什么不同

如果是这样,为什么3.2中的新GIL更好?它到底有什么不同

谢谢。

为什么新吉尔更好 新的GIL旨在克服CPU绑定线程导致IO绑定线程不足的问题。在多核环境中,旧的GIL倾向于支持CPU绑定线程而不是IO绑定线程,因为它允许CPU绑定线程连续获取GIL。在新的GIL中,一个线程不能连续执行,即使它碰巧获得了GIL(它最终必须释放它)。一个线程将无法运行其字节码,直到它等待一定的持续时间(这反过来会让另一个线程获取GIL)

简而言之,如果你想看看新的GIL是否比旧的好:使用IO绑定线程。你会发现反应能力提高了

通常,Python应用程序执行IO绑定的任务。如果您想运行CPU绑定的代码,可以通过C扩展运行单独的线程(您需要释放GIL并在使用C代码完成后重新获取它)

关于旧GIL中间隔从100增加到100000时的性能提升 根据我的分析,线程会在每100个滴答声后释放旧的GIL,这意味着每100个滴答声后会从用户空间切换到内核空间,并且它会继续,直到线程完成OS调度器分配的时间片。当您将刻度增加到100000时,线程不会释放GIL(因此没有用户到内核的切换),而是会完全利用CPU(在其时间段内),因此您可能会发现性能提升,因为另一个线程也是CPU受限的(它也会在其时间段内完全利用CPU)


但是,如果另一个线程恰好是IO绑定的线程,它将受到影响,其响应能力将下降。

如果没有您的代码,图表将一无所获。@klaud。对此我很抱歉。我已经包括了代码!