Pythonマルチスレッド下のlistを詳しく説明します。


listはPythonでよく使われているいくつかの基本的なデータのタイプの一つです。通常の状況では、listを添削して調べます。明らかに分かりやすくて、問題はありません。マルチスレッドの下でlistを操作してみたら問題がありますか?
マルチスレッド下のリスト
安全ですか?危ないです
通常、スレッドセキュリティとは、あるデータ構造に対するポインタのすべての動作がスレッドセキュリティであり、この定義では、Pythonで一般的に使用されるデータ構造list,dict,str などはスレッドが安全ではない。
マルチスレッド下の list はスレッドが安全ではないが、append の動作下ではスレッドが安全である。
スレッドの安全をどう判断しますか?
スレッドの安全が不安定なため、極端な条件で再現でき、結論が出ます。例えば、list がスレッド安全かどうかを判断する。

import threading
import time

#      count   ,          
count = 1000
l = []

def add():
  for i in range(count):
    l.append(i)
    time.sleep(0.0001)

def remove():

  for i in range(count):
    l.remove(i)
    time.sleep(0.0001)


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=remove)
t1.start()
t2.start()
t1.join()
t2.join()
print(l)
一回の運行では間違いがあるとは限りません。何度もやり直したら次のようなエラーが発生します。

このような操作は普遍的ではないことは明らかです。ヨーロッパの空気が強すぎると、ずっと異常がないかもしれません。
このような方法がありますが、簡単で効果的な方法がありますか?答えはある
dis
disライブラリはPythonが持参したライブラリで、バイトコードを解析するために使用できます。ここでは、バイトコードの各行は原子で動作し、マルチスレッド切り替えは原子で動作する単位であるという認識が必要です。一つの操作に二行バイトコードが必要であれば、スレッドが安全でないということを説明します。
remove
ここでまず上のlistremoveの操作を見ます。

>>> import dis
>>> def test_remove():
...   a = [1]
...   a.remove(0)
... 
>>> dis.dis(test_remove)
 2      0 LOAD_CONST        1 (1)
       2 BUILD_LIST        1
       4 STORE_FAST        0 (a)

 3      6 LOAD_FAST        0 (a)
       8 LOAD_ATTR        0 (remove)
       10 LOAD_CONST        2 (0)
       12 CALL_FUNCTION      1
       14 POP_TOP
       16 LOAD_CONST        0 (None)
       18 RETURN_VALUE
上記からは、remove全体の動作がいくつかのコマンドに分かれていることが分かります。これはマルチスレッドの場合、エラーが発生することを意味します。
apped
上記では、removelist操作はスレッドが安全であると述べましたが、一体なぜですか?私達も同じように append で調べてみます。

8     19 LOAD_GLOBAL       0 (a)
      22 LOAD_ATTR        2 (append)
      25 LOAD_CONST        2 (1)
      28 CALL_FUNCTION      1
      31 POP_TOP  
ここでは、disにもいくつかの命令があり、必然的にマルチスレッドで実行される場合にもインターリーブが発生しますが、マルチスレッドではappendを操作しています。私たちはこの時の appendから順番に問題があることは間違いないです。だから、list はスレッドで安全だと言っています。
参照
https://stackoverflow.com/questions/6319207/are-lists-thread-safe/19728536#19728536
https://docs.python.org/3/faq/library.html#what-キングス-off-global-value-muttionn-are-thread-safe
以上はPythonマルチスレッド下のlistの詳細を詳しく説明しました。Pythonマルチスレッド下のlistに関する資料は他の関連記事に注目してください。