我在两个模块中有以下代码。
模块“主要”:
#!/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()函数时未设置变量?
在示例代码中,我跳过了使用锁来使代码成为线程安全的问题。
有什么想法吗?
非常感谢
托马斯
答案 0 :(得分:1)
会发生这种情况,因为您将main.py
作为python(python main.py
)的参数传递了。
以这种方式执行脚本时,python会将main
模块解释为__main__
,但是b
模块仍会更新main.a
变量而不是__main__.a
,因为b
已将main.py模块重新导入为main
。
因此,要使其发挥作用,我们可以从__main__.a
模块的角度更新api_a
函数中的b
或从其中打印main.a
变量而不是__main__.a
__main__
模块的透视图。
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__
文档