84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
认证高级PHP讲师
これは理解しやすいです。GIL は、Python バイト コードがプロセス内で同時に実行されるネイティブ スレッドが 1 つだけであることを保証します。ただし、バイト コード自体のロジックでは、スレッドが再入可能であることを保証するためにロック/相互排他などが依然として必要です。これは、バイト コードが実行プロセス中の任意の時点で中断され、別のスレッドに切り替わる可能性があるためです。 簡単な例:
// ステップ 1counter = get_counter()// ステップ 2counter += 1/ /ステップ 3set_counter(counter) 最初のカウンタが 0 で、2 つのスレッドがこの Python コードを同期せずに同時に実行すると仮定します。
ただし、ロック/相互排他がないため、実行状況は次のようになります。
に切り替わります。
これは理解しやすいです。GIL は、Python バイト コードがプロセス内で同時に実行されるネイティブ スレッドが 1 つだけであることを保証します。ただし、バイト コード自体のロジックでは、スレッドが再入可能であることを保証するためにロック/相互排他などが依然として必要です。これは、バイト コードが実行プロセス中の任意の時点で中断され、別のスレッドに切り替わる可能性があるためです。
カウンター コード:簡単な例:
// ステップ 1
期待される結果は両方のスレッドがカウントし、最終的なカウンタは 2 になるはずです。counter = get_counter()
// ステップ 2
counter += 1
/ /ステップ 3
set_counter(counter)
最初のカウンタが 0 で、2 つのスレッドがこの Python コードを同期せずに同時に実行すると仮定します。
ただし、ロック/相互排他がないため、実行状況は次のようになります。
スレッド A がステップ 1 の実行を完了すると、カウンターは 0 になります。これは、スレッド B に切り替えることを意味します
スレッド B はステップ 1、2、3 を正常に実行しました。現在、カウンターは 1 であり、その後 A スレッド A はステップ 2 を実行し続けてカウンタを 1 に設定し、次にステップ 3 でカウンタを 1 に設定します。 -
最終結果は 1 です。
に切り替わります。