python - 变量范围(带线程)

标签 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()时没有设置变量?

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

有什么想法吗?

提前致谢

托马斯

最佳答案

出现这种行为是因为您将 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/

相关文章:

iOS:在回调函数中调用 setNeedDisplay 时出现线程问题

python - 使用QThread的PyQt5 OpenCV WebCam

python - 我应该如何在多模块 Python 应用程序中建立和管理数据库连接?

python - 在 Lion 上运行 wxPython

c# - 不断检查服务器是否正在使用C#监听给定的端口

java - 如何使用关闭 Hook 优雅地停止 Guava AbstractScheduledService?

python - pyschool 错了吗?

python - wxpython 拖放一个文件夹,然后拖放另一个文件夹以添加到列表

java - 我的代码中线程 "Thread-2"java.lang.NullPointerException.error 中出现异常

c - 在收到 SIGINT 或 SIGTERM(C 中的 Posix 线程)后关闭服务器之前等待线程终止