认证高级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 です。
に切り替わります。