2017-01-13 8 views
3

これはPythonには新しいものではありませんが、これはしばらく私を悩ませているものです。私は目的球の中に文字列としてのMyStringを渡す場合:Python関数のスレッドに渡される変数は安全ですか?

def func(mystring): 
    print(mystring) 
    #do other things to mystring 

そして、FUNC多くのスレッドによって呼び出され、スレッドセーフをMYSTRINGされますか?別のスレッドがfuncを呼び出したときにその値を変更できますか?

私の考えは、ミストリングが不変であるためではありません。変更可能なオブジェクトはスレッドセーフではありませんが、変更できないオブジェクトはどうですか?

+0

あなたが求めているコードについてさらに多くの情報を提供しない限り、スレッドの安全性については何も言えません(非常に保守的な「いいえ」を除く)。 –

+0

整数は不変ですが、スレッドセーフではありません。 – Delgan

+0

[この投稿](https://www.quora.com/Are-local-variables-in-a-python-function-thread-safe)が役立つかもしれません。 – Tagc

答えて

3

私が間違っていればうまくいけばいいと思うが、答えははい - mystringはスレッドセーフです。からthis post

ローカル変数は確かに "スレッド排他的"です。他のスレッドは直接それらにアクセスすることはできませんが、これは有用ですが、セマンティックスレッドの安全性を保証するのには十分ではありません。

あるスレッドのローカル変数は、その値を別のスレッドの同じ名前のローカル変数と同じ場所に格納しません。

これは基本的に、関数とローカル変数の定義の直接的な結果です。多かれ少なかれ、すべての構造化プログラミング言語のような何かをし、次の

  • 関数が呼び出されるたびに、メモリの新しいブロックがスタックフレームが割り当てられていると呼ばれる(と、それが無効になる/破壊されたときに関数が戻ります) 。

  • ローカル変数の値は、そのスタックフレーム内に格納されます。ローカル変数として

funcは、他のスレッドがアクセスすることができない場所にmystringの値を記憶する呼び出し各スレッド。しかし、2つのスレッドがローカル変数の個別のストレージを持っていることを保証するスレッドを保証するのに十分ではありません

:記事は、スレッドの安全性を確保するために必要なく十分であるスレッド排他性を指摘することになりますこれらのローカル変数はスレッドで安全でない方法でグローバルに共有されるデータを参照できるため、安全です。

ただし、この場合、グローバル共有データには依存していません。 mystringは、ローカルにアクセス可能であり、起動するために不変である文字列オブジェクトを参照します。

スレッド排他性とグローバル状態への相互作用/依存関係がない場合は、スレッドセーフであると考えられます。

+0

これも私の考えです。私の実験からは、あなたが正しいと思われます。ミストリングの変更は他のスレッドには表示されません。しかし、mystringが変更可能なオブジェクトで、そのプロパティを変更した場合、Pythonは参照渡しであるため、渡されたオブジェクトが変更されているように見えます。しかし、どのスレッドが変更可能であっても変更が反映されないという不具合はどうですか? – jnvilo

関連する問題