2016-09-06 4 views
4

以下はPython 3のコードです。常に100000を取得できます。なぜ間違っているのですか?私はそれが異なる結果を持っているべきだと思います。Python 2/3のスレッドで異なる結果

import time, _thread 

global count 
count = 0 
def test(): 
    global count 

    for i in range(0, 10000): 
     count += 1 

for i in range(0, 10): 
    _thread.start_new_thread(test,()) 
time.sleep(5) 
print(count) 

以下はPython 2のコードです。これは常に異なる結果(ランダム)です。

import time, thread 

global count 
count = 0 
def test(): 
    global count 

    for i in range(0, 10000): 
     count += 1 

for i in range(0, 10): 
    thread.start_new_thread(test,()) 
time.sleep(5) 
print count 
+3

Pythonの3がはるかに高速ループを反復処理である、(1) 'と'私の範囲では(10000) ' –

+1

は私の答えを参照してください'睡眠を設定してみてくださいPython 3のほうが高速です。スレッドを変更するための_when_の条件が変更されました。 –

答えて

5

CPython 2では、特定のバイト数のコードが実行された後に切り替えが許可されます。 CPython 3.2は、一定の時間が経過した後にスレッドが切り替わるように変更されました。 test()はたくさんのバイトコードを実行しますが、時間はほとんどありません。

import sys 
sys.setswitchinterval(sys.getswitchinterval()/10.0) 

(デフォルト以外)の10倍以下の時間が経過した後にスレッドを切り替えることができ、すなわち:私が追加した場合、私のボックスで、Pythonの3の下に表示された結果は、例えば、このスタートの近くに、予測不可能になります。

また、_threadは、Python 3では強く推奨されていません。そのため、先頭にアンダースコアが追加されています。以下のように、代わりにthreading.Threadを使用して:本当にその反復がある、それはありません。

for i in range(10): 
    t = threading.Thread(target=test) 
    t.start()