2016-04-29 15 views
0

Heute habe ich ein einfaches Skript, das mir eine Openstack schnellen Server Benchmark erlaubt:Wann wird die GIL veröffentlicht?

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) 

Das geht gut, aber ich bemerkte eine seltsame Sache, den Prozess, wo auf mehr als 400% der CPU-Auslastung Spicken. Wie geschieht das, da die GIL die Verwendung von mehr als 100% der CPU nicht zulassen sollte?

Antwort

1

Die GIL verhindert nur, dass zwei Python-Befehle gleichzeitig ausgeführt werden (wodurch nur eine einzelne CPU gleichzeitig verwendet wird). Aber jeder Python-Code, der C aufruft, kann die GIL freigeben, bis der C-Code erneut mit dem Python-SDK verbunden werden muss, normalerweise, wenn er zurückkehrt und die Ergebnisse zurück in Python-Werte migriert. Es ist also möglich, Python-Anwendungen mit hohem Threading zu verwenden, wenn sie C-Bibliotheken verwenden.

Aus dem Python-Wiki auf das die potenziell GIL

Hinweis zu blockieren oder mit langer Laufzeit Operationen, wie I/O, Bildverarbeitung und NumPy Zahlknirschens, passieren außerhalb des GIL. Daher ist es nur in Multithread-Programmen, die eine Menge Zeit in der GIL verbringen, CPYthon Bytecode interpretierend, dass die GIL ein Engpass wird.

+0

In meinem Code ist jede benutzte Bibliothek reine Python, wie würden Sie das erklären? – user312016

+0

'Anfragen' und' swiftclient' verwenden beide 'socket', die eine C-Komponente hat. Irgendwann ruft CPython den C-Code auf. I/O-Vorgänge wie die Kommunikation über Sockets klingen genau wie die Art von Dingen, die die GIL freigeben würden. –

+0

Das macht Sinn. Vielen Dank ! – user312016