我有一个主要调用的后台线程,后台线程可以打开许多不同的脚本,但偶尔会得到这样的无限打印循环。
thing.py
import 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
中放置标志,以便在标志变高时返回,但是background
永远无法检查标志,因为它等待bar
返回。
答案 0 :(得分:1)
首先,无论您使用何种语言,都很难(如果可能)控制来自其他线程的线程。这是由于潜在的安全问题。所以你要做的就是创建一个共享对象,两个线程都可以自由访问。你可以在上面设置一个标志。
但幸运的是,在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")
虽然这可能很难维护/调试。把它当作黑客来对待它。更清洁的方法是创建一个共享对象并将其传递给所有调用。