私はPythonのMTを理解しようとしています。 threading.Lock
を使用した例が見つかりました。しかし、それはPython 2.7とPython 3.6で異なる出力を生成しました。本当に混乱しました。ここでスレッドモジュールがPython 3で変更されましたか?そしてもしそうなら、どうですか?
はコードです:
import threading
import time
import random
class meThread(threading.Thread):
def run(self):
global num
time.sleep(random.randint(1,3))
num += 1
print(self.name+'set num to '+str(num))
num = 0
threads = []
for i in range(5):
t = meThread()
threads.append(t)
for i in range(5):
threads[i].start()
for i in range(5):
threads[i].join()
とPython3.6での出力:
Thread-4set num to 1
Thread-2set num to 2
Thread-1set num to 3
Thread-3set num to 4
Thread-5set num to 5
とPython2.7での出力:
Thread-1set num to 1
Thread-4set num to 2
Thread-3set num to 4
Thread-2set num to 5
Thread-5set num to 3
出力が常にあります3.6では同じですが、2.7では、threading.Lock
を使用しないと予期しないことが起こります。どうして? Pythonは3.6で自動的にスレッドにロックを追加しますか?
第2のものが最初に間違っているのは何ですか? 2.6でコードを数回実行しましたか? –
ランダムな時間間隔を使用して各スレッドをスリープさせているときに、同じ結果が期待されるのはなぜですか?ランダムな時間間隔は実行時に異なるかもしれませんが、Pythonの同じバージョンでコードを実行すると、別の結果を返す可能性があります –
3.6では、出力は常に1,2,3,4,5ですが、1,3,4 、2,5など、2.7のように、昇順ではありません。私はthreading.Lockを使用していない場合、異なるスレッドがグローバル変数varを同時に変更できることを意味し、出力は2.7のように任意でなければなりません。しかし出力は3.6と常に同じです。 – Bruce