ホームページ  >  記事  >  バックエンド開発  >  Pythonの勉強ノート - ThreadLocal

Pythonの勉強ノート - ThreadLocal

高洛峰
高洛峰オリジナル
2017-02-16 11:03:011316ブラウズ

マルチスレッド プログラムを作成するとき、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 サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。