今天,我编写了一个简单的脚本,允许我对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?
答案 0 :(得分:2)
GIL只能防止两个python命令同时运行(导致它一次只使用一个CPU)。但是,任何调用C的python代码都有可能释放GIL,直到C代码必须再次与Python SDK接口,通常是在它返回并将结果编组回Python值时。因此,如果他们大量使用C库,就有可能拥有高度线程化的python应用程序。
来自GIL
上的python wiki请注意可能阻塞或长时间运行的操作,例如 I / O,图像处理和NumPy数字运算都发生在外面 GIL。因此,只有在多线程程序中花费很多 GIL内部的时间,解释CPython字节码,即GIL 成为瓶颈。