变量范围(带线程)

时间:2018-09-16 16:24:02

标签: python multithreading

我在两个模块中有以下代码。

模块“主要”:

#!/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()函数时未设置变量?

在示例代码中,我跳过了使用锁来使代码成为线程安全的问题。

有什么想法吗?

非常感谢

托马斯

1 个答案:

答案 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__文档