異なるスレッドのクラス間で変数を渡しますか?

ハイメ

スレッドを使用する2つのクラスがあると仮定します

class foo(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self,name="foo=>bar")
        self.var1 = {}

    def run(self):
        while True
            value, name = getvalue()  // name is an string
            self.var1[name] = value
            bar(self)


class bar(threading.Thread):
    def __init__(self,fooInstance):
        threading.Thread.__init__(self,name="bar")

    def run(self):
        while True
            arg = myfunction()  // somefunction (not shown for simplicity)
            val = myOtherfunction(fooInstance.var1[arg])  //other function
            print(val)


f = foo()
f.start()

の変数var1foo時間の経過とともに変化するため、barこれらの変化に注意する必要があります。それは私には理にかなっていますが、最終的に失敗する可能性のある基本的な何かがここにあるのではないかと思います。これはPythonで正しいですか?

abarnert

実際の共有部分は、「他のオブジェクトと値を共有するにはどうすればよいですか?」と同じ質問です。スレッドなしで、すべて同じソリューションが機能します。

例えば。すでにfooインスタンスをbarイニシャライザに渡しているので、そこから取得します。

class bar(threading.Thread):
    def __init__(self,fooInstance):
        threading.Thread.__init__(self,name="bar")
        self.var1 = fooInstance.var1

しかし、これはスレッドセーフですか?

ええ、そうですが、実際にバックグラウンドスレッドを開始したことがないからです。ただし、実際のコードでは、2つのスレッドが同時に実行され、両方がそのvar1値にアクセスすると想定しています。その場合、何らかの同期がないとスレッドセーフではありません。例えば:

class foo(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self,name="foo=>bar")
        self.var1 = {}
        self.var1lock = threading.Lock()

class bar(threading.Thread):
    def __init__(self,fooInstance):
        threading.Thread.__init__(self,name="bar")
        self.var1 = fooInstance.var1
        self.var1lock = fooInstance.var1lock

そして今、これの代わりに:

self.var1[name] = value

… これをして:

with self.var1lock:
    self.var1[name] = value

そして同様に、これの代わりに:

val = myOtherfunction(fooInstance.var1[arg])  //other function

… これをして:

with self.var1lock:
    var1arg = var1[arg]
val = myOtherfunction(var1arg)

または…結局のところ、CPythonでは、dict内の単一のキーの値の更新(dictサブクラスやカスタムマッピングクラスではなく、組み込みのみ!)は常にアトミックであり、おそらく常にアトミックになります。あなたがその事実に頼りたいのなら、あなたはそうすることができます。しかし、ロックが重大なパフォーマンスの問題であることが判明した場合にのみ、それを行います。そして、それを明確にするために、それを使用するたびにコメントしたいと思います。


値を共有するのではなく渡す方がよい場合、通常の答えはまたはその親戚の1つです。queue.Queue

ただし、これにはプログラムの再設計が必要です。たとえば、新しい/変更された各キーと値のペアをキューに渡したい場合があります。それは次のようになります:

class foo(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self,name="foo=>bar")
        self.var1 = {}
        self.q = queue.Queue()
    def run(self):
        b = bar(self)
        b.start()
        while True:
            value, name = getvalue()  // name is an string
            self.var1[name] = value
            self.q.put((name, value))
class bar(threading.Thread):
    def __init__(self,fooInstance):
        threading.Thread.__init__(self,name="bar")
        self.var1 = copy.deepcopy(fooInstance.var1)
        self.q = fooInstance.q
    def _checkq(self):
        while True:
            try:
                key, val = self.q.get_nowait()
            except queue.Empty:
                break
            else:
                self.var1[key] = val
    def run(self):
        while True:
            self._checkq()
            arg = myfunction()  // somefunction (not shown for simplicity)
            val = myOtherfunction(fooInstance.var1[arg])  //other function
            print(val)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++-のスレッド間で異なるクラスの関数にシグナルを渡しますか?

分類Dev

マルチスレッド-異なるクラスのメソッド間で変数を渡す

分類Dev

メソッド間で同じクラスの変数を渡しますか?

分類Dev

異なるCPUを固定している2つのスレッド間でいくつかの変数を渡すための最適な方法

分類Dev

Javaでクラスの異なるインスタンスを実行しているスレッド間で静的変数を同期する方法は?

分類Dev

異なるクラスのメソッド間で値を渡すために引数を使用できないのはどうしてですか

分類Dev

Javaで異なるスレッドに変数を渡す方法

分類Dev

複数の異なるスレッド間で変数を共有する

分類Dev

graphvizのfdpレイアウトを使用して、同じクラスター内のノード間と異なるクラスター内のノード間で異なるエッジスプラインを使用する方法はありますか?

分類Dev

2つのメソッド間で異なるクラスの変数を交換する

分類Dev

メインスレッドではないスレッドを使用して、クラスの静的Bool変数がtrueになるまで待機する方法は?

分類Dev

異なるスレッドでの非同期メソッドの継続-オブジェクト変数への協調的な2スレッドアクセスを意味しますか?

分類Dev

クラス変数がメソッド間で値を変更するのはなぜですか?

分類Dev

異なる名前空間にある異なるクラスから変数にアクセスします

分類Dev

クラスのメソッド関数で親クラスの静的変数を渡します

分類Dev

Python-異なるクラスの異なるインスタンス間で変数を共有する

分類Dev

クラス間でPHPは同様のメソッドですが、メンバーの変数スコープが異なりますか?

分類Dev

クラス間でPHPは同様のメソッドですが、メンバーの変数スコープが異なりますか?

分類Dev

クラスは、Javaの2つの異なるスレッドに対して2つの実行メソッドを持つことができますか?

分類Dev

異なるレベルのマルチレベルインデックスにアクセスし、このインデックスの列を配列に変換してから、関数に渡します

分類Dev

javascriptで2つの異なる変数を渡しますか?

分類Dev

異なるリクエストの間隔が異なる場合に、単一のjmeterスレッドでリクエストの数を制御する

分類Dev

C#スレッドから異なるスレッドの変数にアクセスする

分類Dev

AsyncTaskを使用してスレッド間で渡されるインスタンス変数の動作は何ですか?

分類Dev

異なるディレクトリ間で、ある関数のリストを別の関数に渡す

分類Dev

新しいスレッドのスタック変数へのポインターを渡します-このコードは安全ですか?

分類Dev

ロックなしで複数のスレッドから動的/変化するデータを読み取る?クラッシュを引き起こす可能性はありますか?それとも単に変数が壊れていますか?

分類Dev

Python:スレッド間でクラス変数を共有する

分類Dev

実行メソッドはどのように異なるスレッドの変数にアクセスしますか?

Related 関連記事

  1. 1

    C ++-のスレッド間で異なるクラスの関数にシグナルを渡しますか?

  2. 2

    マルチスレッド-異なるクラスのメソッド間で変数を渡す

  3. 3

    メソッド間で同じクラスの変数を渡しますか?

  4. 4

    異なるCPUを固定している2つのスレッド間でいくつかの変数を渡すための最適な方法

  5. 5

    Javaでクラスの異なるインスタンスを実行しているスレッド間で静的変数を同期する方法は?

  6. 6

    異なるクラスのメソッド間で値を渡すために引数を使用できないのはどうしてですか

  7. 7

    Javaで異なるスレッドに変数を渡す方法

  8. 8

    複数の異なるスレッド間で変数を共有する

  9. 9

    graphvizのfdpレイアウトを使用して、同じクラスター内のノード間と異なるクラスター内のノード間で異なるエッジスプラインを使用する方法はありますか?

  10. 10

    2つのメソッド間で異なるクラスの変数を交換する

  11. 11

    メインスレッドではないスレッドを使用して、クラスの静的Bool変数がtrueになるまで待機する方法は?

  12. 12

    異なるスレッドでの非同期メソッドの継続-オブジェクト変数への協調的な2スレッドアクセスを意味しますか?

  13. 13

    クラス変数がメソッド間で値を変更するのはなぜですか?

  14. 14

    異なる名前空間にある異なるクラスから変数にアクセスします

  15. 15

    クラスのメソッド関数で親クラスの静的変数を渡します

  16. 16

    Python-異なるクラスの異なるインスタンス間で変数を共有する

  17. 17

    クラス間でPHPは同様のメソッドですが、メンバーの変数スコープが異なりますか?

  18. 18

    クラス間でPHPは同様のメソッドですが、メンバーの変数スコープが異なりますか?

  19. 19

    クラスは、Javaの2つの異なるスレッドに対して2つの実行メソッドを持つことができますか?

  20. 20

    異なるレベルのマルチレベルインデックスにアクセスし、このインデックスの列を配列に変換してから、関数に渡します

  21. 21

    javascriptで2つの異なる変数を渡しますか?

  22. 22

    異なるリクエストの間隔が異なる場合に、単一のjmeterスレッドでリクエストの数を制御する

  23. 23

    C#スレッドから異なるスレッドの変数にアクセスする

  24. 24

    AsyncTaskを使用してスレッド間で渡されるインスタンス変数の動作は何ですか?

  25. 25

    異なるディレクトリ間で、ある関数のリストを別の関数に渡す

  26. 26

    新しいスレッドのスタック変数へのポインターを渡します-このコードは安全ですか?

  27. 27

    ロックなしで複数のスレッドから動的/変化するデータを読み取る?クラッシュを引き起こす可能性はありますか?それとも単に変数が壊れていますか?

  28. 28

    Python:スレッド間でクラス変数を共有する

  29. 29

    実行メソッドはどのように異なるスレッドの変数にアクセスしますか?

ホットタグ

アーカイブ