我在两个模块中有以下代码。
模块“主要”:
#!/usr/bin/python
import threading
import b
a = 0
def api_a():
global a
print("api_a()")
a = 1
def main():
global a
thread_B = b.B_thread()
print("a = " + str(a))
thread_B.start()
# api_a()
thread_B.join()
print("a = " + str(a))
if __name__ == '__main__':
main()
模块“B”:
#!/usr/bin/python
import threading
import main
class B_thread (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print("Starting " + self.name)
B_process()
print("Exiting " + self.name)
def B_process():
main.api_a()
如果我运行这段代码,我会得到:
a = 0
Starting Thread-1
api_a()
Exiting Thread-1
a = 0
为什么变量“a”没有设置为“1”?
如果我激活模块“main”( api_a() ) 中的注释代码行,变量“a”将被设置为“1”。为什么通过线程调用函数api_a()时没有设置变量?
在示例代码中,我跳过了使用锁来使代码线程安全。
有什么想法吗?
提前致谢
托马斯
最佳答案
出现这种行为是因为您将 main.py
作为参数传递给了 python (python main.py
)。
当您以这种方式执行脚本时,python 将main
模块解释为__main__
,但b
模块仍会更新main。 a
变量而不是 __main__.a
,因为 b
已将您的 main.py 模块重新导入为 main
。
因此,为了使其工作,我们可以从 b
模块的角度更新 api_a
函数中的 __main__.a
或打印 从
变量而不是 __main__
模块的角度来看,main.a__main__.a
。
def api_a():
print("api_a()")
import sys
sys.modules['__main__'].a = 1
或
def main():
...
thread_B.join()
import sys
print("a = " + str(sys.modules['main'].a))
__main__
文档
关于python - 变量范围(带线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356112/