2016-04-29 33 views
0

今天,我写了一个简单的脚本,允许我到基准的OpenStack的SWIFT服务器:GIL何时发布?

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

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

从Python维基上GIL

注意,可能阻塞或长时间运行的操作,如 I/O,图像处理,并且NumPy的数字运算,发生的 GIL外部。因此,只有在多线程程序中,在GIL中花费了大量时间,解释CPython字节码,GIL 才成为瓶颈。

+0

在我的代码中,每个使用的lib都是纯python,你会如何解释? – user312016

+0

'requests'和'swiftclient'都使用'socket',它有一个C组件。在某些时候,所有的CPython都会调用C代码。 I/O操作(如通过套接字进行通信)听起来与释放GIL的类型完全相同。 –

+0

这很有道理。谢谢 ! – user312016