何が"スレッドローカルな記憶領域"Pythonでは、が必要なのはなぜですか?

StackOverflow https://stackoverflow.com/questions/104983

質問

Pythonでは具体的には、どのような変数を取得し共有スレッド?

が利用してい threading.Thread り前のようになっているかは見た事例を紹介した変数共用となります。て共有のメインスレッドは、子供たちはみ中の子どもするおそれがある場合はIを利用する必要がスレッドローカルな記憶領域のための共有?

自然と精神との融合によってについての警告を同期アクセスの共有データの中のスレッドをロックでも俺の良い例になりました。)

感謝。

役に立ちましたか?

解決

Pythonでは、すべてが共有を除き、機能-地域の変数が関数呼び出しが独自の設定では、地元の人々の、スレッドは常に分けて発信します。) その後も、変数が自らの名前を参照するオブジェクト)は現地の機能オブジェクト自体は、常にグローバルものを参照することができます。の Thread オブジェクトは、特定のスレッドがショッピングゾーンには、ハウスオブジェクトはこの点に関するご使用にならないときは Thread オブジェクトのどこかのすべてのスレッドがアクセスできるようなグローバル変数)そのすべてのスレッドにアクセスできる Thread オブジェクトです。したい場合に原子的に変更 ることなんでしょうかを作成し、アメリカ、中国、日本などと同じスレッドなかった店舗でもどこでも別のスレッドで取得できていすることに努めます。によるロックになっています。すべてのスレッドはもちろんこのものロック、またはならないからあまり効果がありませんでした。

したい場合は実際のスレッドローカルな記憶領域、が threading.local でアウトソースしましょう。属性 threading.local いない共有スレッド各スレッドのみの属性でも入ります。いつ、その実現に _threading_local.py 標準の図書館があります。

他のヒント

以下のコードを考えてみます::

#/usr/bin/env python

from time import sleep
from random import random
from threading import Thread, local

data = local()

def bar():
    print("I'm called from", data.v)

def foo():
    bar()

class T(Thread):
    def run(self):
        sleep(random())
        data.v = self.getName()   # Thread-1 and Thread-2 accordingly
        sleep(1)
        foo()
 >> T().start(); T().start()
I'm called from Thread-2
I'm called from Thread-1 

このスレッド.地域()を使用し、迅速や汚れにそのような一部のデータからのrun()をマニュアル"連写スピードを変更せずにインタフェースfoo().

がグローバル変数になん:

#/usr/bin/env python

from time import sleep
from random import random
from threading import Thread

def bar():
    global v
    print("I'm called from", v)

def foo():
    bar()

class T(Thread):
    def run(self):
        global v
        sleep(random())
        v = self.getName()   # Thread-1 and Thread-2 accordingly
        sleep(1)
        foo()
 >> T().start(); T().start()
I'm called from Thread-2
I'm called from Thread-2 

一方、きなこのデータを引数としてのfoo()ことによりエレガントなどの設計方法:

from threading import Thread

def bar(v):
    print("I'm called from", v)

def foo(v):
    bar(v)

class T(Thread):
    def run(self):
        foo(self.getName())

これができない場合があり利用の場合は第三者または低ザコードです。

を作成できますスレッドローカルな記憶領域を使用 threading.local().

>>> tls = threading.local()
>>> tls.x = 4 
>>> tls.x
4

データ保存のtlsることから、各スレッドを確保する非意図的生成の共有が発生しない。

のよう毎にその他の言語、Pythonのスレッドにアクセスできるのと同じ変数です。あの区別のスレッド'子スレッド)。

一緒にPythonのグローバル通訳のロックが一つだけのスレッドで走るPythonコードです。ことなく、お付き合いをsynchronisingアクセスして、すべての通常の前emption課題では、使用スレッドプリミティブのようにその他の言語を学んでいます。ない再考する必要がある場合に使用したスレッドがファイアーパフォーマンスの経験でした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top