什么时候发布GIL?

时间:2016-04-29 23:35:52

标签: python python-3.x gil

今天,我编写了一个简单的脚本,允许我对openstack swift服务器进行基准测试:

import swiftclient
import uuid
from concurrent.futures import ThreadPoolExecutor

def create():
    client = swiftclient.client.Connection(
        user='', key='',
        authurl='https://auth/', auth_version='2.0',
        tenant_name='',
        os_options={'tenant_id': '',
                    'region_name': ''})
    while True:
        uid = str(uuid.uuid4())
        client.put_object(container='', obj=uid, contents=b'\x00')

executor = ThreadPoolExecutor(max_workers=100)
for _ in range(100):
    executor.submit(create)

这很顺利,但我注意到一个奇怪的事情,这个过程中CPU占用率超过400%。 这是怎么回事,因为GIL不应该允许使用超过100%的CPU?

1 个答案:

答案 0 :(得分:2)

GIL只能防止两个python命令同时运行(导致它一次只使用一个CPU)。但是,任何调用C的python代码都有可能释放GIL,直到C代码必须再次与Python SDK接口,通常是在它返回并将结果编组回Python值时。因此,如果他们大量使用C库,就有可能拥有高度线程化的python应用程序。

来自GIL

上的python wiki
  

请注意可能阻塞或长时间运行的操作,例如   I / O,图像处理和NumPy数字运算都发生在外面   GIL。因此,只有在多线程程序中花费很多   GIL内部的时间,解释CPython字节码,即GIL   成为瓶颈。