Pythonマルチスレッド下のlistを詳しく説明します。
listはPythonでよく使われているいくつかの基本的なデータのタイプの一つです。通常の状況では、listを添削して調べます。明らかに分かりやすくて、問題はありません。マルチスレッドの下でlistを操作してみたら問題がありますか?
マルチスレッド下のリスト
安全ですか?危ないです
通常、スレッドセキュリティとは、あるデータ構造に対するポインタのすべての動作がスレッドセキュリティであり、この定義では、Pythonで一般的に使用されるデータ構造
マルチスレッド下の
スレッドの安全をどう判断しますか?
スレッドの安全が不安定なため、極端な条件で再現でき、結論が出ます。例えば、
このような操作は普遍的ではないことは明らかです。ヨーロッパの空気が強すぎると、ずっと異常がないかもしれません。
このような方法がありますが、簡単で効果的な方法がありますか?答えはある
dis
disライブラリはPythonが持参したライブラリで、バイトコードを解析するために使用できます。ここでは、バイトコードの各行は原子で動作し、マルチスレッド切り替えは原子で動作する単位であるという認識が必要です。一つの操作に二行バイトコードが必要であれば、スレッドが安全でないということを説明します。
remove
ここでまず上の
apped
上記では、
参照
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に関する資料は他の関連記事に注目してください。
マルチスレッド下のリスト
安全ですか?危ないです
通常、スレッドセキュリティとは、あるデータ構造に対するポインタのすべての動作がスレッドセキュリティであり、この定義では、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
ここでまず上の
list
のremove
の操作を見ます。
>>> 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
上記では、
remove
のlist
操作はスレッドが安全であると述べましたが、一体なぜですか?私達も同じように 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に関する資料は他の関連記事に注目してください。