Pythonマルチスレッドのリストを詳しく説明する

リストは、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

Pythonマルチスレッドのリストを詳しく説明する
Pythonはリスト内の要素をランダムにシャッフルします
pythonでのwheelの使用法
pythonのリスト内包表記とは何ですか
Pythonの数字は何ですか?
Pythonのモジュールについて話す
pythonでのタプルの使用法
pythonでのrbの意味を理解する
Python3クローラーでのAjaxの使用
Pythonマルチスレッド
Python3リスト
pythonでのadbの機能は何ですか
pythonでround関数を使用する方法
Pythonでzip関数を使用する方法
Pythonでの歩留まりを理解するための記事
pythonのタブキーはどういう意味ですか
PythonはDoudizhuでカードのシャッフルを実装します
pythonでのリストの意味と使用法
pythonでformat関数を使用する方法
pythonに最初に精通した、pythonの文法規則
ubuntuでpythonをアンインストールした結果、非常に
ダウンロードしたモジュールをpythonでインストールする方法
Ubuntu18.04の下のディレクトリにディスクをマウントします
Pythonで型を判断するための最良の方法
pythonの関数
パイソンリスト学習
2.1 Pythonインタープリター(pythonインタープリター)
[902] pythonリストソート
UbuntuでのPythonでのGDALのインストールと使用
Pythonでのパッケージの導入を理解する方法
pythonで番号のリストを理解する方法
Pythonデータの視覚化:Pythonの有名人は誰ですか?
歴史上初めて、PythonはJavaを上回りました!
pythonでファイルを開く方法は何ですか
ubuntuの下のLinux環境で発生した問題を解決します