【问题标题】:Exit daemon thread退出守护线程
【发布时间】:2014-05-09 20:07:36
【问题描述】:

如何关闭/退出线程或守护线程?我的应用程序中有这样的东西:

th = ThreadClass(param)
th.daemon = True

if option == 'yes':
    th.start()
elif option == 'no':
    # Close the daemon thread

如何退出应用程序?

【问题讨论】:

  • 我不确定你的意思。在您拥有的 if 语句的 elif 分支中,线程永远不会启动,因此无需“关闭”它。
  • @alecb 但假设我第一次运行应用程序时,option 的值是“yes”。第二次运行时,我将option 设置为“否”。
  • 如果线程是守护线程,那么sys.exit(0) 会导致它关闭。当最后一个非守护线程退出时,所有守护线程应该停止。
  • @vgo 我想你可能对守护线程的作用感到困惑——它们在 python 程序的多次调用或类似的东西上不是“持久的”。如果所有其他(非守护程序)线程都已完成,它们只是不会使程序保持活动状态的线程。
  • 请注意,您的程序只会在所有线程都死机时结束——线程不会从一个执行转移到另一个执行。但是,关闭非守护线程的一种方法是使用th.join(),它将等待线程的函数返回。

标签: python multithreading daemon


【解决方案1】:

通过设置“立即死亡”标志退出应用程序。当父级(或任何人)设置标志时,所有观察它的线程都将退出。

例子:

import time
from threading import *

class WorkerThread(Thread):
    def __init__(self, die_flag, *args, **kw):
        super(WorkerThread,self).__init__(*args, **kw)
        self.die_flag = die_flag

    def run(self):
        for num in range(3):
            if self.die_flag.is_set():
                print "{}: bye".format(
                    current_thread().name
                    )
                return
            print "{}: num={}".format(
                current_thread().name, num,
                )
            time.sleep(1)

flag = Event()

WorkerThread(name='whiskey', die_flag=flag).start()
time.sleep(2)

print '\nTELL WORKERS TO DIE'
flag.set()

print '\nWAITING FOR WORKERS'
for thread in enumerate():
    if thread != current_thread():
        print thread.name,
        thread.join()
    print

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多