尽管GIL,这些代码如何并行执行?

时间:2016-05-23 18:34:51

标签: python gil

这完全是关于Python2.7

我有下一个问题:

from futures import ThreadPoolExecutor

def test():

    while True:

        i = 4


executor = ThreadPoolExecutor(max_workers=2)

executor.submit(test)

executor.submit(test)

因此,当我在双核机器上运行此类代码时,我会让两个内核都忙碌起来 为什么会发生这种情况,因为GIL,他们不应该只使用一半的资源来执行? 我认为他们使用一些系统调用,这就是为什么并行执行, 但我无法理解代码的哪一部分在系统核心上执行。

这里被解雇了:

dis.dis(main)
Disassembly of test:
2         0 SETUP_LOOP              16 (to 19)
    >>    3 LOAD_GLOBAL              0 (True)
          6 POP_JUMP_IF_FALSE       18

3         9 LOAD_CONST               1 (4)
         12 STORE_FAST               0 (i)
         15 JUMP_ABSOLUTE            3
    >>   18 POP_BLOCK           
    >>   19 LOAD_CONST               0 (None)
         22 RETURN_VALUE        

还应该注意,当我运行代码时,我无法通过键入Ctr + C来停止程序。

我认为它的发生是因为我有2个核心和3个线程(1个主线程和2个线程池) 在每次打勾后输入Ctr + C解释器执行检查并且虽然ThreadPool线程是cpu绑定并且具有低优先级主线程但不能准确GIL,因为在ThreadPool线程的另一个核心上捕获GIL更快

但是根据我的理解,有时主线程应该获取GIL并停止程序,但它不会在5分钟内发生。

出了什么问题?

0 个答案:

没有答案