Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递给python函数的变量是线程安全的吗?_Python - Fatal编程技术网

传递给python函数的变量是线程安全的吗?

传递给python函数的变量是线程安全的吗?,python,Python,这对python并不陌生,但这是困扰我一段时间的问题。如果我将mystring作为字符串传递到函数中: def func(mystring): print(mystring) #do other things to mystring func被许多线程调用,mystring线程安全吗?或者,当另一个线程调用func时,它的值可以更改吗 我的想法是不应该这样,因为mystring是不可变的。我知道可变对象不是线程安全的,但是不可变对象呢?如果我错了,希望我能被纠正,但我相信

这对python并不陌生,但这是困扰我一段时间的问题。如果我将mystring作为字符串传递到函数中:

def func(mystring):
     print(mystring)
     #do other things to mystring 
func被许多线程调用,mystring线程安全吗?或者,当另一个线程调用func时,它的值可以更改吗


我的想法是不应该这样,因为mystring是不可变的。我知道可变对象不是线程安全的,但是不可变对象呢?

如果我错了,希望我能被纠正,但我相信答案是是的-
mystring
是线程安全的。发件人:

局部变量当然是“线程独占的”。没有其他线程可以直接访问它们,这很有帮助,但不足以保证语义线程安全

一个线程中的局部变量不会将其值存储在与另一个线程中的同名局部变量相同的位置

这基本上是函数和局部变量定义的直接结果。几乎每种结构化编程语言都会执行以下操作:

  • 每次调用函数时,都会分配一个称为堆栈帧的新内存块(当函数返回时,它将变得无效/销毁)

  • 局部变量的值存储在该堆栈框架内

作为局部变量,调用
func
的每个线程将把
mystring
的值存储在其他线程无法访问的位置。文章接着指出,线程排他性是必要的,但不足以确保线程安全:

但是,保证两个线程分别存储本地变量并不足以确保线程安全,因为这些本地变量可能以线程不安全的方式引用全局共享数据

但是,在这种情况下,您不依赖或修改任何全局共享数据
mystring
引用一个字符串对象,该对象只能在本地访问并且不可启动


在线程排他性和不存在交互/对全局状态的依赖性之间,我相信它是线程安全的。

关于线程安全,我们不可能说任何事情(除了一个非常保守的“否”)除非你提供更多关于你要问的代码的信息。整数是不可变的,但不是线程安全的。你可能会发现它很有用。这也是我的想法。从我的实验来看,你似乎是对的。mystring更改不会显示在其他线程中。但是,如果mystring是一个可变对象,并且我修改了它的一个属性,那么它看起来像是修改了传递的对象,因为python是按引用传递的。但是让我不舒服的是,每个线程都没有看到变化,即使它是可变的。