Python スレッドがバイトコードを一度に 1 つずつしか実行できないことは承知していますが、なぜスレッドライブラリはロックを提供するのでしょうか? 一度に 1 つのスレッドしか実行されていない場合、競合状態は発生しないと想定しています。
ライブラリは、ロック、条件、およびセマフォを提供します。これの唯一の目的は実行を同期することですか?
アップデート:
私は小さな実験を行いました:
from threading import Thread
from multiprocessing import Process
num = 0
def f():
global num
num += 1
def thread(func):
# return Process(target=func)
return Thread(target=func)
if __name__ == '__main__':
t_list = []
for i in xrange(1, 100000):
t = thread(f)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print num
基本的に、100k スレッドを開始し、1 ずつインクリメントする必要がありました。返された結果は 99993 でした。
a) GIL の同期と競合状態の回避がある場合、結果が 99999 にならないのはなぜですか? b) 100k OS スレッドを開始することさえ可能ですか?
回答を見た後の更新2:
GIL がアトミックにインクリメントするような単純な操作を実行する方法を実際に提供していない場合、それをそこに置く目的は何ですか? 厄介な並行性の問題には役立たないのに、なぜ導入されたのでしょうか? C拡張のユースケースを聞いたことがありますが、誰かがこれを例証できますか?