2017-11-21 29 views
0

私は8つのコアを扱うために異なるスレッドを作成しようとしています。しかし、私はコードが8つのスレッドを作成し、私のMacOS上で100%の周りのみを使用して参照してください。 なぜですか?Pythonマルチスレッドは単一のCPUでしか動作しません

def runner(i): 
    # do random stuff 
    for a in range(0,1000000): 
     i+=1 
     5000/34 * i 
     i + 400 
     i/20000 
     i * 24440 
     i+=1 
     5000/34 * i 
     i + 400 
     i/20000 

q = queue.Queue() 
threads = list() 
for x in range(0,80): 
    th = threading.Thread(target=runner,args=(x,)) 
    threads.append(th) 

for th in threads: 
    th.start() 
for th in threads: 
    th.join() 
+0

https://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-pythonとhttps://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-theも参照してください。 -threading-and-multiprocessing-modul –

答えて

2

これは、Python GIL(グローバルインタープリタロック)によるものです。これはPythonスレッドが単一のCPU上で動作するのをブロックします。 あなたはhttps://wiki.python.org/moin/GlobalInterpreterLock

PythonのGILでそれについての詳細を読むことができ、一度にPythonのバイトコードを実行してから、複数のスレッドを防止し、Pythonオブジェクトへのアクセスを保護し、ミューテックスです。このロックは、主にCPythonのメモリ管理がスレッドセーフではないために必要です。

は、あなたのコードは、複数のCPU上で動作multiprocessingモジュールをチェックアウトしたい場合はSO

にここにリストをチェックし、対象に複数の質問があります。

+0

GILを無効にすることはできますが、それほど安全ではありません。 –

+0

@ArtsiomPraneuskiどのようにGILを無効にしても安全ですか? –

+0

@ArtsiomPraneuskiそれは本当に良いアドバイスではありません – Vinny

関連する問題