让线程离开(有意的)无限循环?
Getting a thread to leave an (intentional) infinite loop?
我有一个主要调用的后台线程,后台线程可以打开许多不同的脚本,但偶尔会像这样出现无限打印循环。
在thing.py
导入 foo
def main():
thr = Thread(target=background)
thr.start()
thread_list.append(thr)
def background():
getattr(foo, 'bar')()
return
然后在foo.py
def bar():
while True:
print("stuff")
这是它应该做的,但我希望能够在需要时杀死它。有没有办法杀死后台线程及其调用的所有函数?当标志变高时,我尝试将标志放在 background
到 return 中,但是 background
永远无法检查标志,因为它等待 bar
到 return.
编辑:foo.py 不是我的代码,所以我对编辑它犹豫不决,理想情况下我可以在不修改 foo.py 的情况下做到这一点,但如果无法避免它没关系
首先,无论您使用什么语言,都很难(如果可能的话)从其他线程控制线程。这是由于潜在的安全问题。所以你所做的就是创建一个共享对象,两个线程都可以自由访问。你可以在上面设置一个标志。
但幸运的是,在 Python 中,每个线程都有自己的 Thread
对象,我们可以使用它:
import foo
def main():
thr = Thread(target=background)
thr.exit_requested = False
thr.start()
thread_list.append(thr)
def background():
getattr(foo, 'bar')()
return
在 foo 中:
import threading
def bar():
th = threading.current_thread()
# What happens when bar() is called from the main thread?
# The commented code is not thread safe.
# if not hasattr(th, 'exit_requested'):
# th.exit_requested = False
while not th.exit_requested:
print("stuff")
尽管这可能很难 maintain/debug。更像是一个黑客。更简洁的方法是创建一个共享对象并将其传递给所有调用。
我有一个主要调用的后台线程,后台线程可以打开许多不同的脚本,但偶尔会像这样出现无限打印循环。
在thing.py
导入 foo
def main():
thr = Thread(target=background)
thr.start()
thread_list.append(thr)
def background():
getattr(foo, 'bar')()
return
然后在foo.py
def bar():
while True:
print("stuff")
这是它应该做的,但我希望能够在需要时杀死它。有没有办法杀死后台线程及其调用的所有函数?当标志变高时,我尝试将标志放在 background
到 return 中,但是 background
永远无法检查标志,因为它等待 bar
到 return.
编辑:foo.py 不是我的代码,所以我对编辑它犹豫不决,理想情况下我可以在不修改 foo.py 的情况下做到这一点,但如果无法避免它没关系
首先,无论您使用什么语言,都很难(如果可能的话)从其他线程控制线程。这是由于潜在的安全问题。所以你所做的就是创建一个共享对象,两个线程都可以自由访问。你可以在上面设置一个标志。
但幸运的是,在 Python 中,每个线程都有自己的 Thread
对象,我们可以使用它:
import foo
def main():
thr = Thread(target=background)
thr.exit_requested = False
thr.start()
thread_list.append(thr)
def background():
getattr(foo, 'bar')()
return
在 foo 中:
import threading
def bar():
th = threading.current_thread()
# What happens when bar() is called from the main thread?
# The commented code is not thread safe.
# if not hasattr(th, 'exit_requested'):
# th.exit_requested = False
while not th.exit_requested:
print("stuff")
尽管这可能很难 maintain/debug。更像是一个黑客。更简洁的方法是创建一个共享对象并将其传递给所有调用。