我希望使用全局变量结束在单独线程中运行的循环。但是这段代码似乎没有停止循环中的线程。我希望该程序不再打印'。' 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
答案 0 :(得分:5)
您正在通过调用foo()
在主线程上执行t1.run()
。您应该拨打t1.start()
。
您有foo()
的两个定义 - 无所谓,但不应该在那里。
你没有在线程循环中放入sleep()
(在foo()中)。这非常糟糕,因为它占用了处理器。你应该至少把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
答案 1 :(得分:4)
您不是通过致电run()
来启动主题,而是通过调用start()
启动它。
修复它使它适用于我。
答案 2 :(得分:0)
除了给出的答案......
变量'运行'是一个全局变量。
在其他功能中修改时,例如在main()函数中,必须引用变量为global,否则不会进行全局修改。
def main():
global run
...
run = False
...
if __name__ == "__main__":
main()