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

发布于 2024-11-04 15:15:02 字数 322 浏览 1 评论 0原文

我想使用全局变量结束在单独线程中运行的循环。但这段代码似乎并没有停止循环中的线程。我希望程序不再打印“.” 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

I want to end a loop running in a separate thread using a global variable. but this code does not seem to stop the thread in loop. I expect the program not to print any more '.' after 2 seconds, but it still runs indefinitely.

Am I doing something fundamentally wrong here?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梅窗月明清似水 2024-11-11 15:15:02
  1. 您正在通过调用 t1.run() 在主线程上执行 foo()。您应该调用 t1.start()

  2. 您有两个 foo() 定义 - 没关系,但不应该在那里。

  3. 您没有将 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. You are executing foo() on the main thread by calling t1.run(). You should call t1.start() instead.

  2. You have two definitions of foo() - doesn't matter, but shouldn't be there.

  3. You didn't put a sleep() inside the thread loop (in foo()). This is very bad, since it hogs the processor. You should at least put time.sleep(0) (release time slice to other threads) if not make it sleep a little longer.

Here's a working example:

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
〆一缕阳光ご 2024-11-11 15:15:02

您不是通过调用 run() 来启动线程,而是通过调用 start() 来启动它。
解决这个问题使它对我有用。

You don't start a thread by calling run(), you start it by calling start().
Fixing that made it work for me.

高冷爸爸 2024-11-11 15:15:02

除了给出的答案之外......

变量“run”是一个全局变量。

当您在另一个函数中修改它时,例如在 main() 函数中,您必须引用全局变量,否则它将不会被全局修改。

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

if __name__ == "__main__":
main()

In addition to the answers given ...

The variable 'run' is a global variable.

When you modify it within another function, e.g. within the main() function, you must make reference to the variable being global otherwise it will not be globally modified.

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

if __name__ == "__main__":
main()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文