python教程—如何停止Python中的循环线程?-Python实用宝典

python教程—如何停止Python中的循环线程?

告诉循环线程停止循环的正确方法是什么?我有一个相当简单的程序,它在一个单独的线程中ping指定的主机。线程类。在这个类中,它休眠60秒,然后再次运行,直到应用程序退出。

告诉循环线程停止循环的正确方法是什么?

我有一个相当简单的程序,它在一个单独的线程中ping指定的主机。线程类。在这个类中,它休眠60秒,然后再次运行,直到应用程序退出。

我想实现一个'停止'按钮在我的wx。帧请求循环线程停止。它不需要立即结束线程,只要它醒来就可以停止循环。

下面是我的线程类(注意:我还没有实现循环,但是它可能属于PingAssets中的run方法)

    class PingAssets(threading.Thread): def __init__(self, threadNum, asset, window): threading.Thread.__init__(self) self.threadNum = threadNum self.window = window self.asset = asset def run(self): config = controller.getConfig() fmt = config['timefmt'] start_time = datetime.now().strftime(fmt) try: if onlinecheck.check_status(self.asset): status = "online" else: status = "offline" except socket.gaierror: status = "an invalid asset tag." msg =("{}: {} is {}. n".format(start_time, self.asset, status)) wx.CallAfter(self.window.Logger, msg)

在我的wxPyhton框架中,我有一个从Start按钮调用的函数:

    def CheckAsset(self, asset): self.count += 1 thread = PingAssets(self.count, asset, self) self.threads.append(thread) thread.start()

回答

螺纹可停止的功能

而不是子类化线程。线程,可以修改函数以允许
停在国旗前。

我们需要一个对象,可访问的运行函数,我们设置的标志停止运行。

我们可以使用thread . currentthread()对象。

    import threading import time def doit(arg): t = threading.currentThread() while getattr(t, "do_run", True): print ("working on %s" % arg) time.sleep(1) print("Stopping as you wish.") def main(): t = threading.Thread(target=doit, args=("task",)) t.start() time.sleep(5) t.do_run = False t.join() if __name__ == "__main__": main()

诀窍在于,正在运行的线程可以附加额外的属性。解决方案构建
假设:

  • 线程有一个属性“do_run”,默认值为True
  • 驱动父进程可以将启动线程的属性“do_run”赋值为False。

运行代码,得到如下输出:

    $ python stopthread.py working on task working on task working on task working on task working on task Stopping as you wish.

杀丸事件

另一种选择是使用线程。事件作为函数参数。它是由
默认为False,但是外部进程可以“设置它”(为True),函数可以
使用wait(timeout)函数了解它。

我们可以使用零超时来等待,但也可以使用它作为睡眠计时器(如下所示)。

    def doit(stop_event, arg): while not stop_event.wait(1): print ("working on %s" % arg) print("Stopping as you wish.") def main(): pill2kill = threading.Event() t = threading.Thread(target=doit, args=(pill2kill, "task")) t.start() time.sleep(5) pill2kill.set() t.join()

编辑:我在Python 3.6中尝试过这个。wait()将阻塞事件(以及while循环),直到release。它不返回布尔值。而是使用stop_event.is_set()。

一粒药就能断多根线

如果我们必须停止多线程,那么口服避孕药的优势就更明显了
立刻,就像一粒药对所有人都有效一样。

doit根本不会改变,只是主线程处理线程的方式略有不同。

    def main(): pill2kill = threading.Event() tasks = ["task ONE", "task TWO", "task THREE"] def thread_gen(pill2kill, tasks): for task in tasks: t = threading.Thread(target=doit, args=(pill2kill, task)) yield t threads = list(thread_gen(pill2kill, tasks)) for thread in threads: thread.start() time.sleep(5) pill2kill.set() for thread in threads: thread.join()

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论