【问题标题】:Where are functions parameters stored in python? Stack? or Heap?python中函数参数存储在哪里?堆?还是堆?
【发布时间】:2016-05-07 09:23:03
【问题描述】:

我在一个线程对象中有一个函数,这个函数接受几个参数,我不知道当很多线程尝试使用这个函数时,这个线程是否会改变另一个线程的参数值?

我可以使用锁,但是在分配了参数之后。 如果参数存储在堆栈中,我猜它们将存在于每个线程堆栈中,但如果它们存在于堆中,如何避免线程更改另一个线程的函数参数?

【问题讨论】:

  • 您能再说明一下您的担忧吗?我们是在讨论函数内部的 locals,还是在调用函数时将参数传递给 to 函数?
  • 我不确定您是否知道,但函数的不同执行不会“共享”对相同参数的引用(除非您使用引用相同的参数显式调用它们)。即使对于单线程程序也是如此,并且是允许递归函数正确运行所必需的。例如,如果调用堆栈中较低的 x 值覆盖了调用堆栈中较高的 x 值,def fib(x): return 1 if x <= 1 else fib(x-1) + fib(x-2) 会给出奇怪的结果。
  • @MartijnPieters 我说的是我在调用函数时传递给函数的参数。
  • @Kevin 我不明白这个“(除非你用引用相同的参数明确地调用它们)”你能解释更多吗?谢谢。最后你告诉我,不管是单线程函数调用还是跨多个线程共享的函数调用,每个调用都有自己的内存空间来存放参数值?
  • @Lben:我仍然不确定您希望在哪里出现竞争条件?没有任何可变对象可以免受其他线程的突变。您是否担心两次调用同一个函数会混淆参数?

标签: python multithreading memory heap-memory stack-memory


【解决方案1】:

函数参数入栈,每个线程都有自己的栈。您不必担心它们的线程安全性。

但是,所有 Python 对象都存储在堆上;堆栈仅保存对此类对象的引用。如果多个线程正在访问一个这样的可变对象,如果访问没有以某种方式同步,它们仍然可以相互干扰。然而,这与函数的调用方式无关。

【讨论】:

  • 谢谢你能指出一些资源吗?谢谢
  • 您能先回答我对您的问题的询问吗?我想给你正确的资源。
  • 我已经回答了你的问题,抱歉耽搁了。
  • 谢谢,例如,为什么在Java中有些方法是同步的?是因为它们内部是对堆中对象的引用吗?
  • @Lben:这与如何调用方法以及如何将参数传递给函数调用无关。这只是意味着对该方法的任何调用都会锁定该实例;对该对象的同步方法的任何其他调用都必须等到锁被释放。
猜你喜欢
  • 2021-05-25
  • 2014-08-14
  • 2014-04-21
  • 2010-11-15
  • 2016-09-08
  • 2020-01-10
  • 1970-01-01
  • 2021-06-19
  • 2015-05-03
相关资源
最近更新 更多