让线程离开(有意的)无限循环?

时间:2017-10-13 14:58:54

标签: multithreading python-3.x python-multithreading

我有一个主要调用的后台线程,后台线程可以打开许多不同的脚本,但偶尔会得到这样的无限打印循环。

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返回。

编辑:foo.py不是我的代码所以我对编辑它犹豫不决,理想情况下我可以在不修改foo.py的情况下做到这一点,但是如果它不可能避免它好吗

1 个答案:

答案 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")

虽然这可能很难维护/调试。把它当作黑客来对待它。更清洁的方法是创建一个共享对象并将其传递给所有调用。