【问题标题】:Threads not exiting and program won't exit线程不退出,程序不退出
【发布时间】:2016-08-29 02:04:26
【问题描述】:

使用下面的脚本,我似乎无法退出线程。该脚本运行顺利,没有问题,但完成后永远不会退出。我仍然可以看到线程活着,我必须使用htop 来杀死它们或完全退出命令行。

我怎样才能让这个脚本退出并让线程死掉?

def async_dns():
    s = adns.init()
    while True:
        dname = q.get()
        response = s.synchronous(dname,adns.rr.NS)[0]
        if response == 0:
            dot_net.append("Y")
            print(dname + ", is Y")
        elif response == 300 or response == 30 or response == 60:
            dot_net.append("N")
            print(dname + ", is N")
        elif q.empty() == True:
            q.task_done()

q = queue.Queue()
threads = []
for i in range(20):
    t = threading.Thread(target=async_dns)
    threads.append(t)
    t.start()

for name in names:
    q.put_nowait(name)

【问题讨论】:

  • 启动线程前先填满队列,等队列为空时让线程函数返回。
  • 线程是否在 async_dns 内启动?
  • 您可以轻松地做到这一点,以便在主线程退出时所有线程都退出。请参阅my answer 问题sys.exit 对多线程有什么作用? 请注意,在您的情况下,您不需要显式调用sys.exit(),它会在最终的@987654325 之后自动发生@循环在脚本末尾。

标签: python multithreading


【解决方案1】:

从队列中删除并返回一个项目。如果可选 args 块为真且超时为无(默认值),则在必要时阻止,直到项目可用。如果 timeout 是一个正数,它最多会阻塞 timeout 秒,如果在那段时间内没有可用的项目,则会引发 Empty 异常。否则(block 为 false),如果一个项目立即可用,则返回一个项目,否则引发 Empty 异常(在这种情况下忽略超时)。

记得检查你的队列。

queue的文档。

【讨论】:

    【解决方案2】:

    你的线程卡在dname = q.get()

    如果您到达空队列,q.get() 将永远等待值到达。

    您可以将get 替换为get_nowait(),但准备好捕获Queue.Empty execption

    【讨论】: