マルチスレッド プログラムを作成するとき、2 種類の変数に遭遇することがよくあります。
1 つはグローバル変数で、複数のスレッドで共有されます。動作の変更を避けるために、ロックが必要であると前に述べました。
1 つはローカル変数です。 1 つのスレッドによってのみ使用され、スレッドは相互に影響を与えません。
例えば、以下のプログラムのtask()
函数中定义的count
变量就是局部变量。即使我们创建了两个线程,两者的count
递增也不会相互影响,因为count
是在task
には何が定義されているかとなります。
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
それでは、このように処理するのが完璧でしょうか?まだ。
上記の例は非常に単純ですが、複数のローカル変数、複数の関数呼び出しなど、より複雑なビジネス ロジックに遭遇すると、この方法でローカル変数を定義するのは簡潔でなく面倒になります。
複数の関数呼び出しとは、次のようなものを指します。
関数、methodA() を定義します。このメソッド本体は、methodB()、methodB() を呼び出します。 メソッド本体は、methodC() を呼び出します...
特定のスレッドにいる場合、methodA( ) が呼び出され、変数 attr が使用される場合、attr を後続の関数にレイヤーごとに渡す必要があります。
スレッド内で変数を定義して、このスレッド内のすべての関数を呼び出すことができる方法はありますか?これは簡潔で明確ですか?
Python がそれを実行します。つまり、ThreadLocal です。
ThreadLocal の使用には、次の 3 つの手順のみが必要です。
オブジェクト threading.local を定義する
スレッド内のオブジェクトにパラメータをバインドします。すべてのバインドされたパラメーターはスレッド分離されます。
スレッド内で呼び出します。
コードは以下に示されています:
# coding=utf-8 import threading local = threading.local() # 创建一个全局的对象 def task(): local.count = 0 # 初始化一个线程内变量,该变量线程间互不影响。 for i in range(1000): count_plus() def count_plus(): local.count += 1 print threading.current_thread().name, local.count if __name__ == '__main__': t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
その他の Python 学習メモ - ThreadLocal 関連記事については、PHP 中国語 Web サイトに注目してください。