2016-04-29 15 views
0

今日、私はベンチマークにOpenStackの迅速なサーバーを私を許可簡単なスクリプトを書きました: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はCPUの100%以上の使用を許可すべきではないので、どうしたのですか?

答えて

1

GILは、2つのpythonコマンドが同時に実行されないようにします(一度に1つのCPUのみを使用するようにします)。しかし、C言語を呼び出すPythonコードは、CコードがPython SDKと再度イ​​ンターフェイスするまでGILを解放する可能性があります。通常、結果をPython値に戻してマーシャルします。したがって、Cライブラリを大量に使用する場合は、高度にスレッド化されたPythonアプリケーションを使用することが可能です。 GIL

にPythonのウィキから

潜在的にブロッキング又は I/O、画像処理、及びnumpyの番号などの長時間実行操作は、計算処理注、 GIL外起こります。したがって、GILの中に多くの時間を費やし、CPythonのバイトコードを解釈して、GIL がボトルネックになるのは、マルチスレッドのプログラムでしかありません。

+0

私のコードでは、すべてのlibは純粋なpythonですが、どうすればそれを説明できますか? – user312016

+0

'requests'と' swiftclient'は両方ともCコンポーネントを持つ 'socket'を使います。ある時点で、CPythonはすべてCコードを呼び出します。ソケットを介した通信のようなI/O操作は、GILをリリースするもののタイプとまったく同じです。 –

+0

意味があります。ありがとう! – user312016

関連する問題