ホームページ  >  に質問  >  本文

Python内部是如何存储GC引用变量的计数的?

PHP中文网PHP中文网2741日前506

全員に返信(1)返信します

  • ringa_lee

    ringa_lee2017-04-18 10:10:49

    これは理解しやすいです。GIL は、Python バイト コードがプロセス内で同時に実行されるネイティブ スレッドが 1 つだけであることを保証します。ただし、バイト コード自体のロジックでは、スレッドが再入可能であることを保証するためにロック/相互排他などが依然として必要です。これは、バイト コードが実行プロセス中の任意の時点で中断され、別のスレッドに切り替わる可能性があるためです。

    簡単な例:

    カウンター コード:

    // ステップ 1
    counter = get_counter()
    // ステップ 2
    counter += 1
    / /ステップ 3
    set_counter(counter)

    最初のカウンタが 0 で、2 つのスレッドがこの Python コードを同期せずに同時に実行すると仮定します。

    期待される結果は両方のスレッドがカウントし、最終的なカウンタは 2 になるはずです。


    ただし、ロック/相互排他がないため、実行状況は次のようになります。

      スレッド A がステップ 1 の実行を完了すると、カウンターは 0 になります。これは、スレッド B に切り替えることを意味します
    1. スレッド B はステップ 1、2、3 を正常に実行しました。現在、カウンターは 1 であり、その後 A
    2. に切り替わります。

    3. スレッド A はステップ 2 を実行し続けてカウンタを 1 に設定し、次にステップ 3 でカウンタを 1 に設定します。
    4. 最終結果は 1 です。

    返事
    0
  • キャンセル返事