如何在Python中在线程间共享全局变量?

9 投票
3 回答
20981 浏览
提问于 2025-04-16 16:37

我想用一个全局变量来结束一个在单独线程中运行的循环。但是这段代码似乎没有停止循环中的线程。我希望程序在2秒后不再打印'.',但它还是一直在运行。

我是不是在这里做错了什么根本性的事情?

import time
import threading
run = True

def foo():
    while run:
        print '.',

t1 = threading.Thread(target=foo)
t1.run()
time.sleep(2)
run = False
print 'run=False'
while True:
    pass

3 个回答

1

除了之前给出的回答...

变量 'run' 是一个全局变量。

当你在另一个函数里修改它,比如在 main() 函数里,你必须说明这个变量是全局的,否则它不会被全局修改。

def main():
    global run
    ...
    run = False
    ...

if __name__ == "__main__":
main()
4

你不是通过调用 run() 来启动一个线程,而是要通过调用 start() 来启动它。这样做就能让它正常工作了。

5
  1. 你在主线程上执行 foo(),是通过调用 t1.run() 来实现的。其实你应该用 t1.start() 来启动线程。

  2. 你定义了两个 foo() 函数,这没什么大不了的,但最好不要这样。

  3. 你在线程循环(也就是 foo() 里面)没有放 sleep()。这样做很糟糕,因为会占用处理器资源。你至少应该放一个 time.sleep(0)(这样可以把时间片让给其他线程),如果能让它睡得更久一点就更好了。

下面是一个可以正常工作的例子:

import time
import threading
run = True

def foo():
    while run:
        print '.',
        time.sleep(0)

t1 = threading.Thread(target=foo)
t1.start()
time.sleep(2)
run = False
print 'run=False'
while True:
    pass

撰写回答