リストは、Pythonで一般的に使用されるいくつかの基本的なデータタイプの1つです。通常の状況では、リストを追加、削除、変更、およびチェックします。もちろん、問題はありません。その後、複数のスレッドでリストを操作しようとすると、問題が発生します。 ?
マルチスレッドの下のリスト
**安全か危険か?安全ではありません! ****
一般的に、スレッドの安全性とは、特定のデータ構造に対するすべての操作がスレッドセーフであることを意味します。この定義では、Pythonで一般的に使用されるデータ構造 list、dict、str
などはすべてスレッドセーフではありません。
マルチスレッドでの list
はスレッドセーフではありませんが、 append
の操作ではスレッドセーフです。
**スレッドの安全性を判断する方法は? ****
糸の安全性と危険性については、極端な条件でも再現し、結論を出すことができます。たとえば、 list
がスレッドセーフかどうかを判断します
import threading
import time
# countの値を自由に設定します。値が大きいほど、エラーのスローが速くなります。
count =1000
l =[]
def add():for i inrange(count):
l.append(i)
time.sleep(0.0001)
def remove():for i inrange(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)
1回の実行でエラーが発生するとは限らず、複数回再試行すると次のようなエラーが発生する場合があります。
明らかに、この操作方法は普遍的ではありません。ヨーロッパの精神が強すぎる場合は、異常はないかもしれません。
それで、この方法から、簡単で効果的な方法はありますか?答えはイエスです
dis
disライブラリは、Pythonに付属し、バイトコードの分析に使用できるライブラリです。ここでは、バイトコードの各行がアトミック操作であり、マルチスレッドスイッチングがアトミック操作に基づいていることを理解する必要があります。操作に2行のバイトコードが必要な場合は、スレッドが安全でないことを意味します。
remove
ここでは、最初に上記の「リスト」の「削除」操作を見ていきます。
import dis
def test_remove():... a =[1]... a.remove(0)...
dis.dis(test_remove)20 LOAD_CONST 1(1)2 BUILD_LIST 14 STORE_FAST 0(a)36 LOAD_FAST 0(a)8 LOAD_ATTR 0(remove)10 LOAD_CONST 2(0)12 CALL_FUNCTION 114 POP_TOP
16 LOAD_CONST 0(None)18 RETURN_VALUE
上記から、「削除」操作全体が複数の命令に分割されていることを確認するのは難しくありません。つまり、マルチスレッドの場合は混乱が生じます。マルチスレッドの下の「削除」リストに移動した場合を想像してみてください。順番に、問題が発生しやすいです。
append
冒頭で、 list
の append
操作はスレッドセーフであると述べましたが、なぜですか? dis
もチェックしてみましょう
819 LOAD_GLOBAL 0(a)22 LOAD_ATTR 2(append)25 LOAD_CONST 2(1)28 CALL_FUNCTION 131 POP_TOP
ここで明らかに、 append
にはいくつかの命令があり、マルチスレッド実行の場合は必然的にインターリーブされますが、マルチスレッドでの append
の操作については、現時点では list
の順序は絶対に気にしません。 、つまり、その append
はスレッドセーフであると言います
参照
https://stackoverflow.com/questions/6319207/are-lists-thread-safe/19728536#19728536
https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe
上記は、Pythonマルチスレッドのリストの詳細な内容です。Pythonマルチスレッドのリストの詳細については、ZaLou.Cnの他の関連記事に注意してください。
Recommended Posts